У меня проблема с моей программой; в настоящее время он вращается вокруг заданной точки и может вращать модели вокруг него. Конечно, это проблема, поскольку я хочу, чтобы это была перспектива от первого лица, и в настоящее время она вращается вокруг точки перед зрителем, а не с точки зрения зрителя. Вот тригонометрические расчеты:
protected void drawWireframe(Graphics g) {
double theta = Math.PI * -azimuth / 180.0D;
double phi = Math.PI * elevation / 180.0D;
float cosT = (float) Math.cos(theta);
float sinT = (float) Math.sin(theta);
float cosP = (float) Math.cos(phi);
float sinP = (float) Math.sin(phi);
float cosTcosP = cosT * cosP;
float cosTsinP = cosT * sinP;
float sinTcosP = sinT * cosP;
float sinTsinP = sinT * sinP;
float near = 6.0F;
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
for (int i = 0; i < tiles.size(); i++) {
Point[] points = new Point[vertices.length];
for (int j = 0; j < points.length; j++) {
float x0 = -(tiles.get(i).getX() + xmod + vertices[j]
.getX());
float y0 = (tiles.get(i).getY() + ymod + vertices[j].getY());
float z0 = -(tiles.get(i).getZ() + zmod + vertices[j]
.getZ());
float x1 = cosT * x0 + sinT * z0;
float y1 = -sinTsinP * x0 + cosP * y0 + cosTsinP * z0;
float z1 = cosTcosP * z0 - sinTcosP * x0 - sinP * y0;
if (z1 + near > 0) {
x1 = x1 * near / (z1 + near);
y1 = y1 * near / (z1 + near);
points[j] = new Point((int) (Math.max(getWidth(),
getHeight()) / 2 - (Math.max(getWidth(),
getHeight()) / near) * x1), (int) (Math.max(
getWidth(), getHeight()) / 2 - (Math.max(
getWidth(), getHeight()) / near) * y1));
}
}
}
}
Как мне перемещать точку вращения, не изменяя xmod, ymod и zmod (они используются для таких движений, как прыжки, ходьба, бег, приседание и т. Д.)
Я знаю, как выяснить, как получить новые позиции x, y и z, я просто не знаю, как их применять; если я добавлю их в моды, это создаст странную петлю-петлю. Если я добавлю их к x1, y1, z1, это не покроет z, не вращающийся с перспективы.