View difference between Paste ID: 1EfRq1GP and jhhM78mv
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;