【问题标题】:C# XNA Camera position follow concrete mesh/boneC# XNA 相机位置跟随混凝土网格/骨骼
【发布时间】:2015-01-11 21:34:35
【问题描述】:

如何使相机位置取决于模型中特定元素(网格/骨骼)的旋转和位置。

 #region CameraModeEye
 if (mode == CameraMode.Eye) // do poprawienia
 {
     Matrix[] transforms = new Matrix[objectModel.Model.Bones.Count];
     objectModel.Model.CopyBoneTransformsTo(transforms);

     // test
     Matrix World = (transforms[objectModel.Model.Meshes["Eye"].ParentBone.Index] * objectModel.Transform) * transforms[3];

     new_position = transforms[3].Forward;
     new_lookAt = new_position + Vector3.Forward;
     camVector = Vector3.Up;
 }
 #endregion

 ...

 view = Matrix.CreateLookAt(new_position, new_lookAt, camVector);

我有一个机器人模型(形状为 蝎子),其中包含以下元素: 身体、头部、眼睛。

“Head”随X轴旋转,依赖于“Body” 而“Eye”随Y轴旋转,依赖于“Head”。

我希望摄像机位置稍微偏离“眼睛”。 我尝试了很多方法,但每次都得到这样的结果:

World.Forward {X: -2,301742E-24 Y: 3,456487E-14 Z -1}

实际上应该是这样的:

              {X: -10.0         Y: 500.0        Z: 0}

我无法理解。 我厌倦了两天,我找不到解决方案。 请帮忙

【问题讨论】:

    标签: c# model camera xna position


    【解决方案1】:
    if (mode == eye)//pseudoed
    {
      Matrix[] transforms = new Matrix[objectModel.Model.Bones.Count];
         objectModel.Model.CopyAbsoluteBoneTransformsTo(transforms);
    
      Vector3 cameraPosition = (transforms["eye"] * objectModel.Transform).Translation;//I'm assuming objectModel.Transform is the world matrix for the model 
      Vector3 cameraLookAt = cameraPosition + transforms[eye].Forward;//camera looking in the same direction as the eye
    
      view = Matrix.CreateLookAt(cameraPosition, cameraLookAt, Vector3.Up);
    }
    

    此代码应该传达我认为您正在尝试做的事情的方式。注意我使用CopyAbsoluteBoneTransformsTo 而不仅仅是CopyBoneTransformsTotransforms[eye] 的绝对版本实际上是眼睛到头部到身体的结果,它给出了眼睛的世界空间位置和方向。而 transforms[eye] 不使用绝对版本只是眼睛和头部之间的旋转和平移差异(这是您的代码使用的)。

    您的 World.Forward 不应给出 -10,500,0,但可能 (World.Translation + World.Forward) 可能。

    【讨论】:

      【解决方案2】:

      哦,正是我的意思。

      后来我明白我应该使用“CopyAbsoluteBoneTransformsTo”而不是“CopyBoneTransformsTo”。 最后,我写了这段代码,但他是我的11行。 : D

      现在,对 Matrix 的操作只需要 3 行:

       Matrix[] transforms = new Matrix[objectModel.Model.Bones.Count];
       objectModel.Model.CopyAbsoluteBoneTransformsTo(transforms);
      
       Matrix offset = Matrix.CreateTranslation(Vector3.Down * 70 + Vector3.Forward * 10);
       new_position = (offset * transforms[3] * objectModel.Transform).Translation;
       new_lookAt = new_position + transforms[3].Down; 
      

      我不得不添加一个额外的矩阵(它在教室中全局存储),它负责“眼睛”元素模型的移动位置。 否则,相机位置在“眼睛”内,视图隐藏在墙模型后面。


      这只是另一个小问题。 即没有旋转轴Z。 我不知道他会怎么解释。

      假设:

      • 人的脖子是我的骨头“头”,你只能前后旋转。

      • 人头是我的骨“眼”,只能左右旋转。

      当旋转到脖子后,并且头部向左或向右旋转时,我们会看到一个角度的图像。

      我的机器人一直在看前方,好像他们只是错过了 Z 轴旋转

      我应该在最后使用类似的东西吗?

       view * = Matrix.CreateRotationZ (MathHelper.ToRadians (Rotz));
      

      【讨论】:

      • 和方向:Down,Up,Forward,backward,我的模型有点破,请不要担心这个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2019-06-13
      • 2021-08-03
      相关资源
      最近更新 更多