转换层次结构导致对象在空间中跳跃?

时间:2014-06-27 20:52:46

标签: c++ opengl graphics

我有两个对象,我想要父母一起,所以Tri是Torus的孩子。当我这样做并通过将父母模型视图添加到孩子时将子节点相乘,孩子最初在空间中跳跃,向右跳跃几个单位。我在哪里插入一个偏移量,我该如何计算呢?

obj = make_shared<Object>(*this);
obj->rename("tri");
obj->type->val_s = "tri";
obj->t->val_3 = glm::vec3(-4.f, 1.5f, 0.f);
allObj.push_back(obj);


obj = make_shared<Object>(*this);
obj->rename("torus");
obj->type->val_s = "obj";
obj->t->val_3 = glm::vec3(3.f, 2.f, 0.f);
allObj.push_back(obj);

//Matrix
scaleM = glm::scale(glm::mat4(), s->val_3);
rotationM = glm::toMat4(r_quat);
glm::vec3 usablePivot = t->val_3 - pivot->val_3;
glm::mat4 localAxis1M = glm::translate(glm::mat4(), usablePivot);
glm::mat4 localAxis2M = glm::translate(glm::mat4(), -usablePivot);

translationM = glm::translate(glm::mat4(), t->val_3);

modelM = translationM * localAxis2M * rotationM * scaleM * localAxis1M;

//View
usableView = myGL->ViewM;

//Projection
usableProjection = myGL->ProjectionM;

//MVP
if (parent == "world") { MVP = usableProjection * usableView * modelM; }
else { MVP = usableProjection * usableView * parentTo->modelM * modelM; }

1 个答案:

答案 0 :(得分:0)

我的OpenGL应用程序中的矩阵顺序:

  1. 子对象矩阵

    • 所有权层次结构中最低的是
    • 他们是父母的本地人
    • 他们已经偏移到父空间的点(0,0,0)
    • 如果没有那么他们是世界本地的,那么这就是跳跃的原因
    • 在这种情况下,子对象实际上不是子对象
    • 并将其作为普通对象处理,无父母
  2. 对象世界

    • 是没有父
    • 的对象的变换矩阵
    • 他们是您的场景世界的本地人
  3. 然后进入相机视图

    • 与相机空间相反
    • 其中Z轴是视图方向
  4. 最后是投影

    • 喜欢gluPerspective(...)
    • 这个通常存储在固定管道上的GL_PROJECTION矩阵中
    • 而不是GL_MODELVIEW
  5. 通过glViewport

    分别通过OpenGL完成剪辑
    • (我认为你可以使用的观点)
  6. 寻找更多信息here

    • 您可以查看矩阵的内容
    • 查看存储偏移向量的位置12,13,14
    • 不要忘记这个向量是父坐标系的本地!!!
    • 所以它更有可能被它旋转......
    • 另一个好主意是在其父空间中为每个测试矩阵绘制轴线
    • 看他们是否正确
    • 我使用红色,绿色,蓝色线条表示x,y,z轴
    • 只提取坐标系的原点[12,13,14]
    • 并从中绘制线到同一点+ a *轴向量
    • a是线长(足够大,所以你看到一条线而不是一条点)
    • 轴向量位于x = [0,1,2],y = [4,5,6],z = [8,9,10]
    • 不要忘记将矩阵设置为父坐标系!!!
    • 如果您通过GLSL处理自己的矩阵,那么不要忘记
    • 像Normals这样的方向矢量被转换而没有偏移
    • 所以得到整个变换矩阵(所有多重一起没有投影,有时还有相机)
    • 将偏移设置为零[12,13,14] =(0.0,0.0,0.0)
    • 并乘以此矩阵