在球形附近的3d运动

时间:2011-01-17 19:26:59

标签: iphone objective-c opengl-es 3d

我很长一段时间以来第一次在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放置总是将物体拉到北极和南极,所以它们都在顶部交叉,这对于旋转是不正确的。我需要一种方法来解决这个问题。这是帮助解释的图片:

Screenshot

非常感谢任何帮助,如果您需要更多信息,请告诉我们?

2 个答案:

答案 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);

之后,您可以进行绘图。您还希望在调用glPushMatrixglPopMatrix时将整个内容包装起来以隔离此转换。

答案 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)

万一有人可以使用它,它非常适合相机控制或任何你需要做的精确三维坐标计算。

参考:http://electron9.phys.utk.edu/vectors/3dcoordinates.htm

相关问题