C#Direct X 9.0c - Mesh Intersect

时间:2013-05-04 19:56:19

标签: c# directx mesh intersect

我想使用向上矢量来获取网格的碰撞矢量。

我有一个位置和一个向上向量..用这个展位我计算远向量

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;

我尝试了一些东西,我认为他不会使用我翻译的船舶矩阵......

1 个答案:

答案 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, ...