【问题标题】:OpenGl Rotate object on Y axis to look at another objectOpenGL 在 Y 轴上旋转对象以查看另一个对象
【发布时间】:2018-11-18 20:58:18
【问题描述】:

所以就像在一个主题中,我有 2 个对象,一个我在移动(在 z 和 x 轴上)另一个是静态的,但应该围绕 y 轴旋转以始终像看另一个...这已经一周了

我现在得到的是

从 1object 到 2object 的向量和 2object 的实际查看(也是向量) 我正在计算这两个向量之间的天使并将其添加到 2 个对象的 rotattion.y 中,但它无法正常工作

知道如何让它工作吗?顺便说一句,我正在使用 eular 天使变换

伪代码:

vectorFrom1to2 = vector1 - vector2;
lookatVectorof2ndObject;

我将它们都归一化,然后

float angle = acos(dot(vectorFrom1to2, lookatVectorof2ndObject));
object2.rotateY = angle;

我不知道我在哪里做错了

【问题讨论】:

    标签: opengl math rotation glsl angle


    【解决方案1】:

    作为一般经验法则,在我观察到的许多情况下证明自己是正确的:一旦你发现自己从向量计算 角度,你很可能在做一些不必要的复杂的事情比必要的方式。

    您所需要的只是一个基础变换,它变换第一个对象的局部坐标系,使其局部 Z 轴指向第二个对象。你可以用一个简单的旋转矩阵来做到这一点(前提是你有一个矩阵/向量库可以更容易地实现这一点)。

    因此,假设您有位置为p1 的对象1 和位置为p2 的对象2,并且您希望p1p2 旋转,则可以如下获得旋转矩阵:

    (我这里只是使用 GLSL 伪语法)

    vec3 p1 = ... // <- position of first object
    vec3 p2 = ... // <- position of second object
    vec3 d = normalize(p2 - p1)
    vec3 r = cross(vec3(0.0, 1.0, 0.0), d)
           = vec3(d.z, 0, -d.x)
    mat3 m = mat3(d.z, 0, -d.x, // <- first column ('right' vector)
                  0, 1, 0,      // <- second column (keep Y)
                  d.x, 0, d.z)  // <- third column (map Z to point towards p2)
    

    当用m 变换第一个对象的顶点v 时:v' = m * v 得到对象p1 的Z 轴指向p2 的位置,所有这些都在同一个“世界" 坐标系。

    【讨论】:

    • 伙计谢谢!它比我尝试这样做要好得多!并且成功了!
    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多