AlexandreRDSST

XNA

Feb 5th, 2012
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.41 KB | None | 0 0
  1. //copiar velocidade para obter direção e armazenados separadamente
  2.             Vector3 direction = velocity;
  3.             direction.Normalize();
  4.  
  5.             //ray é baseado fora dos caracteres de velocidade
  6.             Ray ray = new Ray(
  7.                 character.GetWorld().Translation,
  8.                 direction);  
  9.  
  10.             //armazenar posição antiga
  11.             Vector3 oldPos = character.GetWorld().Translation;            
  12.  
  13.             //distância a partir da velha posição para a posição desejada
  14.             float dist = velocity.Length() * gameTime.ElapsedGameTime.Milliseconds;
  15.             Vector3 destination = character.GetWorld().Translation + velocity *  gameTime.ElapsedGameTime.Milliseconds;
  16.             //novo ponto de destino será alterado, se bater em alguma coisa
  17.             Vector3 newDestinationPoint = destination;
  18.  
  19.             //transformações do terreno
  20.             Matrix[] modelTransforms = new Matrix[terrain.model.Bones.Count];
  21.             terrain.model.CopyAbsoluteBoneTransformsTo(modelTransforms);
  22.             //ponto de armazenamento de interseção e um triângulo normal
  23.             Vector3 intersectionPoint;
  24.             Vector3 normalOfTri;
  25.  
  26.             bool isColliding = false;
  27.  
  28.             //para cada malha nas malhas do terreno
  29.             foreach (ModelMesh mesh in terrain.model.Meshes)
  30.             {
  31.                 //transformar essa malha para o pai
  32.                 Matrix absTransform = modelTransforms[mesh.ParentBone.Index] * terrain.GetWorld();
  33.                 //adquirir os triângulos
  34.                 Triangle[] meshTriangles = (Triangle[])mesh.Tag;
  35.                 //para cada triângulo
  36.                 foreach (Triangle tri in meshTriangles)
  37.                 {
  38.                     //armazenar os pontos de triângulo
  39.                     Vector3 transP0 = Vector3.Transform(tri.P0, absTransform);
  40.                     Vector3 transP1 = Vector3.Transform(tri.P1, absTransform);
  41.                     Vector3 transP2 = Vector3.Transform(tri.P2, absTransform);
  42.  
  43.                     //criar plano de pontos do triângulo                    
  44.                     Plane trianglePlane = new Plane(transP0, transP1, transP2);
  45.                     //determinar a distância do início do raio ao triangulo do plano
  46.                     float distanceOnRay = RayPlaneIntersection(ray, trianglePlane);
  47.                     //anotar a posição onde ele colidiu
  48.                     intersectionPoint = ray.Position + distanceOnRay * ray.Direction;
  49.  
  50.                     //se esse ponto está dentro do triângulo
  51.                     if (PointInsideTriangle(transP0, transP1, transP2, intersectionPoint))
  52.                     {                        
  53.                         //se esse ponto está dentro da distância (dist), do ray do jogador e velocidade
  54.                         if (Vector3.Distance(intersectionPoint, character.GetWorld().Translation) < dist)
  55.                         {
  56.                             //adquirir a (direção) normal do triângulo
  57.                             normalOfTri = trianglePlane.Normal;                            
  58.                             normalOfTri.Normalize();
  59.  
  60.                             //escrever nova distância para onde o ponto de intersecção se encontra
  61.                             float planeToDestDist = Vector3.Distance(intersectionPoint, destination);                            
  62.  
  63.                             //Calcular o angulo do triangulo
  64.                             //float diffAngle = Vector3.Dot(Vector3.Up, normalOfTri);
  65.  
  66.                             //aplicar a fórmula de deslizamento
  67.                   newDestinationPoint = destination - planeToDestDist * trianglePlane.Normal;//*friction;
  68.                              
  69.                             //aplicar a fórmula de deslizamento (Modifique para velocity)
  70.             velocity = (newDestinationPoint - oldPos) / gameTime.ElapsedGameTime.Milliseconds;
  71.  
  72.                             //se bater no chão, então estamos nele
  73.                             isColliding = true;
  74.                         }se o ponto está dentro de comprimento ray
  75.                     }//se o ponto está dentro do triângulo
  76.                 }//para cada triângulo
  77.             }//para cada malha(mesh)
  78.  
  79.             //personagem está no chão, se colidiu com qualquer tris
  80.             character.isOnGround = isColliding;
Advertisement
Add Comment
Please, Sign In to add comment