我想使用向上矢量来获取网格的碰撞矢量。
我有一个位置和一个向上向量..用这个展位我计算远向量
public Vector3 SetPlayerToGround(Matrix Object, Matrix Player, Mesh GroundObject)
{
Vector3 IntersectVector = new Vector3(0, 0, 0);
if (GroundObject != null)
{
Vector3 Player_UP = new Vector3(Player.M12, Player.M22, Player.M32);
Vector3 PlayerPos = new Vector3(Player.M14, Player.M24, Player.M34);
Vector3 PlayerPos_Far = PlayerPos - Player_UP ;
gameengine.m_Device.Transform.World = Object;
IntersectInformation closestIntersection;
if (GroundObject.Intersect(PlayerPos, PlayerPos_Far, out closestIntersection))
{
IntersectVector = Player_UP + (PlayerPos_Far * closestIntersection.Dist);
}
}
return IntersectVector;
}
好吧,如果我做
Vector3 PlayerPos_Far = PlayerPos + Player_UP;
他永远不会相交...... 但是我想要交叉的物体总是在“位置 - UpVector”
之下所以我认为
Vector3 PlayerPos_Far = PlayerPos - Player_UP ;
是严格的
为什么我不能相交?
这是一个更好的描述:
Image of a Scene where i need the Intersect
这是玩家,他是一艘船。玩家总是在0,0,0因为我在玩家周围移动世界。如果我向前移动玩家我很有可能只有所有其他物体的位置。 但我认为玩家与Intersect无关......但船只本身。 我使用位置0,0,0和向上向量作为从船上获取地面交叉向量的方向。船的矩阵是(矩阵对象):
Vector3 com = ship.position - gamemanager.player.position;
Matrix world;
world = Matrix.Identity * Matrix.Scaling(0.001f, 0.001f, 0.001f) * Matrix.Translation(com);
m_Device.Transform.World = world;
我尝试了一些东西,我认为他不会使用我翻译的船舶矩阵......
答案 0 :(得分:0)
您必须提供由位置和方向定义的光线。您不必指定两个点。所以通过-PLAYER_UP
而不是PlayerPos_Far
。
此外,Intersect
方法不关心转换。你必须预先变换光线。使用逆世界矩阵(从世界空间转换到模型的空间)来变换光线位置和方向,你应该没问题。
Vector3 rayStart = PlayerPos;
Vector3 rayDir = -PLAYER_UP;
Matrix world; //the ship's world matrix
world = Matrix.Invert(matrix);
rayStart = Vector3.TransformCoordinate(rayStart, world); //you may need to add an out parameter
rayDir = Vector3.TransformNormal(rayDir, world);
GroundObject.Intersect(rayStart, rayDir, ...