Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //copiar velocidade para obter direção e armazenados separadamente
- Vector3 direction = velocity;
- direction.Normalize();
- //ray é baseado fora dos caracteres de velocidade
- Ray ray = new Ray(
- character.GetWorld().Translation,
- direction);
- //armazenar posição antiga
- Vector3 oldPos = character.GetWorld().Translation;
- //distância a partir da velha posição para a posição desejada
- float dist = velocity.Length() * gameTime.ElapsedGameTime.Milliseconds;
- Vector3 destination = character.GetWorld().Translation + velocity * gameTime.ElapsedGameTime.Milliseconds;
- //novo ponto de destino será alterado, se bater em alguma coisa
- Vector3 newDestinationPoint = destination;
- //transformações do terreno
- Matrix[] modelTransforms = new Matrix[terrain.model.Bones.Count];
- terrain.model.CopyAbsoluteBoneTransformsTo(modelTransforms);
- //ponto de armazenamento de interseção e um triângulo normal
- Vector3 intersectionPoint;
- Vector3 normalOfTri;
- bool isColliding = false;
- //para cada malha nas malhas do terreno
- foreach (ModelMesh mesh in terrain.model.Meshes)
- {
- //transformar essa malha para o pai
- Matrix absTransform = modelTransforms[mesh.ParentBone.Index] * terrain.GetWorld();
- //adquirir os triângulos
- Triangle[] meshTriangles = (Triangle[])mesh.Tag;
- //para cada triângulo
- foreach (Triangle tri in meshTriangles)
- {
- //armazenar os pontos de triângulo
- Vector3 transP0 = Vector3.Transform(tri.P0, absTransform);
- Vector3 transP1 = Vector3.Transform(tri.P1, absTransform);
- Vector3 transP2 = Vector3.Transform(tri.P2, absTransform);
- //criar plano de pontos do triângulo
- Plane trianglePlane = new Plane(transP0, transP1, transP2);
- //determinar a distância do início do raio ao triangulo do plano
- float distanceOnRay = RayPlaneIntersection(ray, trianglePlane);
- //anotar a posição onde ele colidiu
- intersectionPoint = ray.Position + distanceOnRay * ray.Direction;
- //se esse ponto está dentro do triângulo
- if (PointInsideTriangle(transP0, transP1, transP2, intersectionPoint))
- {
- //se esse ponto está dentro da distância (dist), do ray do jogador e velocidade
- if (Vector3.Distance(intersectionPoint, character.GetWorld().Translation) < dist)
- {
- //adquirir a (direção) normal do triângulo
- normalOfTri = trianglePlane.Normal;
- normalOfTri.Normalize();
- //escrever nova distância para onde o ponto de intersecção se encontra
- float planeToDestDist = Vector3.Distance(intersectionPoint, destination);
- //Calcular o angulo do triangulo
- //float diffAngle = Vector3.Dot(Vector3.Up, normalOfTri);
- //aplicar a fórmula de deslizamento
- newDestinationPoint = destination - planeToDestDist * trianglePlane.Normal;//*friction;
- //aplicar a fórmula de deslizamento (Modifique para velocity)
- velocity = (newDestinationPoint - oldPos) / gameTime.ElapsedGameTime.Milliseconds;
- //se bater no chão, então estamos nele
- isColliding = true;
- }se o ponto está dentro de comprimento ray
- }//se o ponto está dentro do triângulo
- }//para cada triângulo
- }//para cada malha(mesh)
- //personagem está no chão, se colidiu com qualquer tris
- character.isOnGround = isColliding;
Advertisement
Add Comment
Please, Sign In to add comment