我很长一段时间以来第一次在3d工作。基本上我是在旋转球体并投射x y z绳索,根据球体X和Y旋转将物体放置在表面上。
使用以下代码:
#define piover180 0.01745329252f
GLfloat cosy = cos(yrot * piover180);
island[i].x = rad * sin(xrot * piover180)* cosy;
island[i].y = rad * sin(yrot * piover180);
island[i].z = rad * cos(xrot * piover180) * cosy;
问题是Xrot定位工作正常但是Yrot放置总是将物体拉到北极和南极,所以它们都在顶部交叉,这对于旋转是不正确的。我需要一种方法来解决这个问题。这是帮助解释的图片:
非常感谢任何帮助,如果您需要更多信息,请告诉我们?
答案 0 :(得分:2)
您粘贴的代码示例不完整,因为您没有通过glRotate等人展示如何应用这些计算。这是我如何做到这一点。虽然您可以通过一步完成矩阵计算来优化它,但可能没有必要。
// Move object out to its radius
glTranslatef(radius, 0, 0);
// Apply latitudinal rotation (aka "Yrot")
glRotatef(latitude, 0, 1, 0);
// Apply longitudinal rotation (aka "Xrot")
glRotatef(longitude, 0, 0, 1);
之后,您可以进行绘图。您还希望在调用glPushMatrix
和glPopMatrix
时将整个内容包装起来以隔离此转换。
答案 1 :(得分:0)
我最终使用球面坐标系来解决它。
以下是代码:
island[i].x = rad*sin(xrot*(PI/180))*cos(yrot*(PI/180));
island[i].y = rad*sin(xrot*(PI/180))*sin(yrot*(PI/180));
island[i].z = cos(xrot*(PI/180));
以下是公式:
x = r sinq cosf
y = r sinq sinf
z = r cosq
r = (x2 + y2 + z2)1/2
q = tan-1(z/(x2+y2)1/2)
f = tan-1(y/x)
万一有人可以使用它,它非常适合相机控制或任何你需要做的精确三维坐标计算。