从3D位置和角度计算2D表面坐标

时间:2014-06-04 16:15:17

标签: opengl 3d trigonometry perspectivecamera

我有一个带可移动相机的3D场景。我有相机的3D坐标(x,y,z - > Y是高度)和X和Y旋转(上/下,左/右)。

我想在我正在看的地板上找到坐标(x1,z1)。

基本上如果相机处于(0,4096,0)(4096是高度)并且我的xRotation是45º而我的yRotation是0,我将看到地板上的点(4096,0,0)

我试图对它进行编程但是我被三角测量法困住了。帮助我。

以下代码是我现在所拥有的并且没有完全正常工作:

float x1, z1, anguloX, anguloY;
anguloX = (90 - Xrotation) / 180 * Pi;
anguloY = (90 - Yrotation) / 180 * Pi;

x1 = Yposition * tan(anguloX) * cos(anguloY);
z1 = Yposition * tan(anguloY) * cos(anguloY);

x1 += Xposition;
z1 += Zposition;

1 个答案:

答案 0 :(得分:1)

不要用这种三角函数来打扰自己。使用矩阵和转换来做这种事情通常更实际,也更容易理解。我建议尝试这种方法,而不是称为Ray Casting:

  1. 计算相机视线的方向,你必须看到 相机方向
  2. 使用光线投射来确定视线的交点 场景网格(或只是代表地板的平面)。
  3. 现在关于第一个,这里是伪代码:

    XRotMat = CreateRotationMatrixAroundXAxis(verticalCameraAngel);
    YRotMat = CreateRotationMatrixAroundYAxis(horizentalCameraAngel);
    
    CameraSightDir = YRotMat*XRotMa*initialCameraDir;
    

    关于第二步:

    SightRay.Source = Camera.Position;
    SightRay.Direction = CameraSightDir;
    
    Intersection = IntersectRayWithPlane(SightRay , FloorPlane);
    

    IntersectRayWithPlane是一个非常简单的程序,您可以阅读 here