2013-05-04 4 views
0

Я хочу получить вектор Collide вектора с использованием Up-Vector.C# Direct X 9.0c - 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 ; 

является Rigth

почему я не могу пересекаться?

Вот лучше Описание:

Image of a Scene where i need the Intersect

Вот игрок, и он в корабль. Игрок всегда на 0,0,0, потому что я перемещаю мир вокруг игрока. if i Перемещение игрока вперед i Шанс векторной позиции игрока, который имеет шанс только на позиции всех других объектов. Но я думаю, что игрок не имеет ничего общего с Интерсект .. но сам корабль. Я использую позицию 0,0,0 и верхний указатель в качестве направления для получения пересекающегося вектора земли с корабля. Матрица корабль (Matrix Object):

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

Вы должны обеспечить луч, определенную позицию и направление. Вам не нужно указывать две точки. Итак, перейдите -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, ... 
+0

хорошо и означает я должен принимать только player_up в направлении .. как это: если (GroundObject.Intersect (PlayerPos, Player_UP, из closestIntersection)). но я не разбираюсь в претрансформации. Может, дайте мне пример? – ZeraTFK

+0

см. Отредактированный ответ –

+0

Спасибо, много работает! После Intersect мне пришлось снова преобразовать IntersectVector с помощью обычного объекта Matrix: IntersectVector = Vector3.TransformCoordinate (IntersectVector, Object); – ZeraTFK

 Смежные вопросы

  • Нет связанных вопросов^_^