我的节目有问题;目前它围绕一个设定点旋转,并可以围绕它旋转模型。当然,这是一个问题,因为我希望它是第一人称视角,而且目前,它围绕观众前方的一个点旋转,而不是观察者的视角。这是三角函数计算:
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位置,我只是不知道如何应用它们;如果我将它们添加到mods,它会创建一个奇怪的loop-d-loop。如果我将它们添加到x1,y1,z1,它不会覆盖从视角不旋转的z。
答案 0 :(得分:1)
要更改旋转点,您实际上需要三个变换:
这可以通过多种方式考虑,但这是基本的原则:translate-&gt; rotate-&gt; translate。
答案 1 :(得分:1)
“移动对象的旋转点”的方式是翻译对象,使旋转点位于原点;轮换;然后将对象翻译回来。所有这些都是在内存中,在帧之间完成的 - 用户实际上从未看到移动到原点和后面的对象。
顺便说一句,如果你了解vectors和matrix transformations,那么所有这些内容都会变得非常容易 - 就像你自己看到的那样,没有它们,代码就会失控。
使用矢量/矩阵,上面的所有代码都可以减少到几行。