Форум программистов, компьютерный форум CyberForum.ru

Событие колизии - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Арифметическая прогрессия http://www.cyberforum.ru/cpp-beginners/thread1772582.html
Добрый день всем, пытаюсь решить но никак помогите пожалуйста: На вход программы подаются три целых числа a1, a2 и n. a1 и a2 первые два члена арифметической прогрессии. Вывести значение nго члена в формате, представленном в примерах. 2 4 3 a = 6 3 3 1500 a = 3 9 4 2 a = 4
C++ Вычислить значения выражений Вычислить значения переменных по заданным формулам и наборам исходных данных. На печать вывести значения исходных данных и результаты вычислений с наименованиями выводимых переменных. http://www.cyberforum.ru/cpp-beginners/thread1772556.html
C++ В двоичном файле возвести все элементы в квадрат
В двоичном файле, содержащем данные типа unsigned int, возвести все элементы в квадрат. При превышении границы диапазона записать вместо элемента 0.
C++ Ошибка в учебнике или я чего то не понимаю
В учебнике Дейтела Харви при изучении полиморфизма натолкнулся на такую вещь, создается абстрактный класс, его наследники, а потом в майн создаются объекты его наследников, но компилятор ругается, что мол нельзя создавать объекты абстрактных классов - вот код. #ifndef EMPLOYEE_H_ #define EMPLOYEE_H_ class Employee{ public: Employee(const char*,const char*); virtual ~Employee();...
C++ Бесконечный захват памяти http://www.cyberforum.ru/cpp-beginners/thread1772489.html
#include <iostream> using namespace std; typedef struct {double A;} F; void recurs (F X ; long i ) { i++ cout << i<< " "; recurs (x;i); } int main()
 

Показать сообщение отдельно
BubleBlue
2 / 2 / 2
Регистрация: 21.03.2016
Сообщений: 14
29.06.2016, 03:49     Событие колизии
Помогите написать скрипт для столкновений игрока с треугольниками. Вот скрипт события колизии
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bool collision(float x1,float y1,float z1,float c00,float c01,float c02,float c10,float c11,float c12,float c20,float c21,float c22,float cV00,float cV01,float cV02,float cV10,float cV11,float cV12,float cV20,float cV21,float cV22,float wV0,float wV1,float wV2,float center0,float center1,float center2,float size){
 
bool coll=false;
float yV1=0;
float v01;
float v02;
float v03;
 
v01=(x1-c00)*cV00+(y1-c01)*cV01+(z1-c02)*cV02;
v02=(x1-c10)*cV10+(y1-c11)*cV11+(z1-c12)*cV02;
v03=(x1-c20)*cV20+(y1-c21)*cV21+(z1-c22)*cV02;
yV1=(x1-center0)*wV0+(y1-center1)*wV1+(z1-center2)*wV2;
if(v01>size){
    if(v02<size){
        if(v03>size){
            if(yV1<size){
                if(yV1>-size){
coll=true;
                }
            }
        }
    }
}
return coll;
}
Вот скрипт игрока (То что в upDate1 неважно).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class Player
{ 
public:
   float x,y,z;
   float dx,dy,dz;
   float w,h,d;
   float speed;
   float x00;
   float y00;
   float z00;
   bool coll1;
   GLuint t1;
   bool onGround;
   Player(float x0, float y0, float z0)
   {
    x=x0; y=y0; z=z0;
    dx=0; dy=0; dz=0;
    w=5; h=20; d=5; speed=15;
   }
 
  void update(float time)
   {
       if(y<0){y=0; onGround=true;}
       if(onGround==false){dy-=25000*time;}else{dy=0;}
       if(onGround==true){if(Keyboard::isKeyPressed(Keyboard::Space)){dy=1000;}}
       
 
        if (Keyboard::isKeyPressed(Keyboard::W))    
        {
         dx +=- sin(angleX/180*PI) * speed; 
         dz +=- cos(angleX/180*PI) * speed;
 
 
        }
 
        if (Keyboard::isKeyPressed(Keyboard::S))    
        {
         dx += sin(angleX/180*PI) * speed;
         dz += cos(angleX/180*PI) * speed;
        }
 
        if (Keyboard::isKeyPressed(Keyboard::D))        
        {
         dx += sin((angleX+90)/180*PI) * speed; 
         dz += cos((angleX+90)/180*PI) * speed;
        }
 
        if (Keyboard::isKeyPressed(Keyboard::A))    
        {
         dx += sin((angleX-90)/180*PI) * speed; 
         dz += cos((angleX-90)/180*PI) * speed;
        } 
        
        dx=dx/1.005;
        dz=dz/1.005;
       x+=dx*time;
       y+=dy*time;
       z+=dz*time;
       onGround=false;
   }
 
  void upDate1(float time,int speed,int force){
  if(Mouse::isButtonPressed(Mouse::Left)){
 
      if(coll1==false){
        x00-=sin(angleX/180*PI)*time*speed;
        z00-=cos(angleX/180*PI)*time*speed;
        y00+=tan(angleY/180*PI)*time*speed;
      }
      else
      {
      dx+=(x00-x)/Distance(x,y,z,x00,y00,z00)*force;
      dy+=(y00-y)/Distance(x,y,z,x00,y00,z00)*force;
      dz+=(z00-z)/Distance(x,y,z,x00,y00,z00)*force;
      }
            glBindTexture(GL_TEXTURE_2D, t1);
            glBegin(GL_QUADS);
 
            glTexCoord2f(0, 0);   glVertex3f(x00+0.7, y00+0.7, z00+0.7);
            glTexCoord2f(1, 0);   glVertex3f(x00,  y00, z00);
            glTexCoord2f(1, 1);   glVertex3f( x+0.7+ sin(angleX/180*PI),  y+2, z+0.7+ cos((angleX+90)/180*PI));
            glTexCoord2f(0, 1);   glVertex3f( x+ sin(angleX/180*PI), y+1.3, z+ cos((angleX+90)/180*PI));
 
            glEnd();
  }
  else{
  x00=x;
  y00=y;
  z00=z;
  }
      coll1=false;
  }
};
Вот как заполняются переменные которые используются в функции колизии
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
        size = 5;
        center[0]=(point[0][0]+point[1][0]+point[2][0])/3;
        center[1]=(point[0][1]+point[1][1]+point[2][1])/3;
        center[2]=(point[0][2]+point[1][2]+point[2][2])/3;
 
c[0][0]=(point[0][0]+point[1][0])/2;
c[0][1]=(point[0][1]+point[1][1])/2;
c[0][2]=(point[0][2]+point[1][2])/2;
 
c[1][0]=(point[2][0]+point[1][0])/2;
c[1][1]=(point[2][1]+point[1][1])/2;
c[1][2]=(point[2][2]+point[1][2])/2;
 
c[2][0]=(point[0][0]+point[2][0])/2;
c[2][1]=(point[0][1]+point[2][1])/2;
c[2][2]=(point[0][2]+point[2][2])/2;
 
        vDirection[0][0]=point[1][0]-point[0][0];
        vDirection[0][1]=point[1][1]-point[0][1];
        vDirection[0][2]=point[1][2]-point[0][2];
 
        vDirection[1][0]=point[1][0]-point[2][0];
        vDirection[1][1]=point[1][1]-point[2][1];
        vDirection[1][2]=point[1][2]-point[2][2];
 
        vDirection[2][0]=point[0][0]-point[2][0];
        vDirection[2][1]=point[0][1]-point[2][1];
        vDirection[2][2]=point[0][2]-point[2][2];
 
    wVector[0]=vDirection[0][1]*vDirection[1][2]-vDirection[0][2]*vDirection[1][1];
    wVector[1]=vDirection[0][2]*vDirection[1][0]-vDirection[0][0]*vDirection[1][2];
    wVector[2]=vDirection[0][0]*vDirection[1][1]-vDirection[0][1]*vDirection[1][0];
 
    colliderVector[0][0]=vDirection[0][1]*wVector[2]-vDirection[0][2]*wVector[1];
    colliderVector[0][1]=vDirection[0][2]*wVector[0]-vDirection[0][0]*wVector[2];
    colliderVector[0][2]=vDirection[0][0]*wVector[1]-vDirection[0][1]*wVector[0];
 
    colliderVector[1][0]=vDirection[1][1]*wVector[2]-vDirection[1][2]*wVector[1];
    colliderVector[1][1]=vDirection[1][2]*wVector[0]-vDirection[1][0]*wVector[2];
    colliderVector[1][2]=vDirection[1][0]*wVector[1]-vDirection[1][1]*wVector[0];
 
    colliderVector[2][0]=vDirection[2][1]*wVector[2]-vDirection[2][2]*wVector[1];
    colliderVector[2][1]=vDirection[2][2]*wVector[0]-vDirection[2][0]*wVector[2];
    colliderVector[2][2]=vDirection[2][0]*wVector[1]-vDirection[2][1]*wVector[0];
    float dst = Distance(0,0,0,wVector[0],wVector[1],wVector[2]);
    for(int i=0;i<3;i++){wVector[i]=wVector[i]/dst;}
    
    for(int i=0;i<3;i++){
        dst = Distance(0,0,0,colliderVector[i][0],colliderVector[i][1],colliderVector[i][2]);
        for(int j=0;j<3;j++){
    colliderVector[i][j]=colliderVector[i][j]/dst;
        }}
А вот как я вызываю эту функцию
C++
1
collision(p.x,p.y,p.z,meshMap[i]->c[0][0],meshMap[i]->c[0][1],meshMap[i]->c[0][2],meshMap[i]->c[1][0],meshMap[i]->c[1][1],meshMap[i]->c[1][2],meshMap[i]->c[2][0],meshMap[i]->c[2][1],meshMap[i]->c[2][2],meshMap[i]->colliderVector[0][0],meshMap[i]->colliderVector[0][1],meshMap[i]->colliderVector[0][2],meshMap[i]->colliderVector[1][0],meshMap[i]->colliderVector[1][1],meshMap[i]->colliderVector[1][2],meshMap[i]->colliderVector[2][0],meshMap[i]->colliderVector[2][1],meshMap[i]->colliderVector[2][2],meshMap[i]->wVector[0],meshMap[i]->wVector[1],meshMap[i]->wVector[2],meshMap[i]->center[0],meshMap[i]->center[1],meshMap[i]->center[2],1)
Мне нужно написать код который будет отталкивать либо останавливать игрока если функция collision = true, и при этом игрок скользил по треугольнику.

Добавлено через 4 часа 35 минут
Другой вопрос, как сделать так чтобы градус между векторами был более 90 градусов при том что один из них не нормализованный?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru