如何使相机位置取决于模型中特定元素(网格/骨骼)的旋转和位置。
#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"。
我希望相机位置稍微远离眼睛" Eye"。 我尝试了很多方法,但每次我得到这样的东西:
World.Forward {X: -2,301742E-24 Y: 3,456487E-14 Z -1}
实际上它应该是这样的:
{X: -10.0 Y: 500.0 Z: 0}
我无法理解。 我厌倦了两天,我找不到解决方案。 请帮忙
答案 0 :(得分: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);
}
此代码应该传达我认为您正在尝试做的事情的方式。请注意,我使用的是CopyAbsoluteBoneTransformsTo
,而不仅仅是CopyBoneTransformsTo
。 transforms[eye]
的绝对版本实际上是眼睛与头部相乘的结果,它给出了世界空间的位置和眼睛的方向。而不使用绝对版本的transforms[eye]
只是眼睛和头部之间的旋转和平移差异(这是您的代码所使用的)。
你的World.Forward不应该给-10,500,0,但可能(World.Translation + World.Forward)可能。
答案 1 :(得分:0)
OOO,正是我的意思。
后来我明白我应该使用' 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;
我必须添加一个额外的矩阵(它全局存储在教室中),它负责移动" Eye"的元素模型的位置。 否则,摄像机位置位于" Eye"并且视图隐藏在墙模型后面。
这只是另一个小问题。 即,没有旋转轴Z. 我不知道他会如何解释它。
假设:
人的脖子是我的骨头"头"并且你只能向前和向后旋转它。
人头是我的骨头"眼睛"你只能向左和向右旋转它。
当向后旋转到颈部,并且头部向左或向右旋转时,我们会以一定角度看到图像。
我的机器人一直在前方,好像他们错过了Z轴旋转
我到底应该使用类似的东西吗?
view * = Matrix.CreateRotationZ (MathHelper.ToRadians (Rotz));