C#XNA摄像机位置遵循混凝土网格/骨骼

C#XNA摄像机位置遵循混凝土网格/骨骼,c#,model,camera,xna,position,C#,Model,Camera,Xna,Position,如何使摄影机位置取决于模型中特定元素(网格/骨骼)的旋转和位置 #region CameraModeEye if (mode == CameraMode.Eye) // do poprawienia { Matrix[] transforms = new Matrix[objectModel.Model.Bones.Count]; objectModel.Model.CopyBoneTransformsTo(transforms); // test

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

 #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);
我有一个机器人模型(蝎子的形状),它有如下元素: 身体、头部、眼睛

“头部”随X轴旋转,并取决于“身体” “眼睛”随Y轴旋转,并依赖于“头部”

我想让相机的位置稍微从“眼睛”开始安装。 我尝试过很多方法,但每次我都会得到这样的结果:

World.Forward {X: -2,301742E-24 Y: 3,456487E-14 Z -1}
              {X: -10.0         Y: 500.0        Z: 0}
实际上应该是这样的:

World.Forward {X: -2,301742E-24 Y: 3,456487E-14 Z -1}
              {X: -10.0         Y: 500.0        Z: 0}
我不明白。 我厌倦了这两天,找不到解决办法。 请帮忙

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);
}
这段代码应该传达我认为您正在尝试做的事情的方式。请注意,我使用的是
CopyAbsoluteBonetTransformsTo
,而不仅仅是
CopyBonetTransformsTo
变换[眼睛]
的绝对版本实际上是眼睛到头部再到身体的乘积,从而给出眼睛的世界空间位置和方向。而
在不使用绝对版本的情况下变换[眼睛]
只是眼睛和头部之间的旋转和平移差异(这就是代码所使用的)


你的World.Forward不应该给出-10500,0,但可能(World.Translation+World.Forward)会给出。

OOO,这正是我的意思

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

现在,对矩阵的运算只需要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));

方向是:向下,向上,向前,向后,我有一个坏掉的模型,请不要担心这个