SHOW:
|
|
- or go back to the newest paste.
| 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 |
| 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; |