C# XNA 相机位置跟随具体 mesh/bone
C# XNA Camera position follow concrete mesh/bone
如何使相机位置取决于模型中特定元素(网格/骨骼)的旋转和位置。
#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);
我有一个机器人模型(蝎子 的形状)具有以下元素:
Body,头,眼。
"Head" 随 X 轴旋转并依赖于 "Body"
并且 "Eye" 随 Y 轴旋转并依赖于 "Head".
我希望相机位置稍微偏离 "Eye"。
我尝试了很多方法,但每次我得到这样的结果:
World.Forward {X: -2,301742E-24 Y: 3,456487E-14 Z -1}
where 实际上应该是这样的:
{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);
}
此代码应传达执行我认为您正在尝试执行的操作的方法。请注意,我使用 CopyAbsoluteBoneTransformsTo
而不仅仅是 CopyBoneTransformsTo
。 transforms[eye]
的绝对版本实际上是将眼睛乘以头部与 body 相乘的结果,后者给出了眼睛的世界空间位置和方向。而 transforms[eye]
不使用绝对版本只是眼睛和头部之间的旋转和平移差异(这是您的代码使用的)。
您的 World.Forward 不应给出 -10,500,0,但可能 (World.Translation + World.Forward) 可能。
哦哦,我的意思是。
后来才明白应该用'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。
不知道他会怎么解释。
假设:
人的脖子是我的骨头"Head"只能前后旋转
人头是我的骨头"Eye"只能左右旋转
当旋转到脖子向后,头部向左或向右旋转时,我们会看到一个角度的图像。
我的机器人一直看着前方,好像他们只是错过了 Z 轴旋转
我应该在最后使用类似的东西吗?
view * = Matrix.CreateRotationZ (MathHelper.ToRadians (Rotz));
如何使相机位置取决于模型中特定元素(网格/骨骼)的旋转和位置。
#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);
我有一个机器人模型(蝎子 的形状)具有以下元素: Body,头,眼。
"Head" 随 X 轴旋转并依赖于 "Body" 并且 "Eye" 随 Y 轴旋转并依赖于 "Head".
我希望相机位置稍微偏离 "Eye"。 我尝试了很多方法,但每次我得到这样的结果:
World.Forward {X: -2,301742E-24 Y: 3,456487E-14 Z -1}
where 实际上应该是这样的:
{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);
}
此代码应传达执行我认为您正在尝试执行的操作的方法。请注意,我使用 CopyAbsoluteBoneTransformsTo
而不仅仅是 CopyBoneTransformsTo
。 transforms[eye]
的绝对版本实际上是将眼睛乘以头部与 body 相乘的结果,后者给出了眼睛的世界空间位置和方向。而 transforms[eye]
不使用绝对版本只是眼睛和头部之间的旋转和平移差异(这是您的代码使用的)。
您的 World.Forward 不应给出 -10,500,0,但可能 (World.Translation + World.Forward) 可能。
哦哦,我的意思是。
后来才明白应该用'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。 不知道他会怎么解释。
假设:
人的脖子是我的骨头"Head"只能前后旋转
人头是我的骨头"Eye"只能左右旋转
当旋转到脖子向后,头部向左或向右旋转时,我们会看到一个角度的图像。
我的机器人一直看着前方,好像他们只是错过了 Z 轴旋转
我应该在最后使用类似的东西吗?
view * = Matrix.CreateRotationZ (MathHelper.ToRadians (Rotz));