Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > help opengl!


Автор: MrCherry 2.2.2007, 14:29
Код

#include <windows.h>
#include <math.h>
#include <gl\glut.h>

void init(void);
void display(void);
void idle(void);
void mouse(int button, int state, int x, int y);
void motion(int x, int y);
void reshape(int w, int h);

int st=0;

GLfloat spin=0.0;
float p[4]={3,3,3,1},
      d[3]={-1,-1,-3};

GLfloat xprev, yprev, accel, ver=1, hor;

int main(int argc, char *argv[])
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
  glutInitWindowSize(400,400);
  glutInitWindowPosition(100,200);
  glutCreateWindow("OpenGl Test");
  init();
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutIdleFunc(idle);
  glutMouseFunc(mouse);
  glutMotionFunc(motion);
  glutMainLoop();
  return 0;
}

void init(void)
{
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glEnable(GL_COLOR_MATERIAL);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glLightfv(GL_LIGHT0,GL_POSITION,p);
  glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  if (hor!=0 || ver!=0) glRotated(spin,ver,hor,0);
  glColor3f(0.5,0.5,1.0);
  glutWireTeapot (2);
  glPopMatrix();
  glFlush();
  glutSwapBuffers();
}

void idle(void){
if (st==0) spin=spin+accel;
if(spin>360.0) spin=spin-360.0;
glutPostRedisplay();
}

void reshape(int w, int h)
{
  glViewport( w/2-h/2, 0, h, h );
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-5,5, -5,5, 2,12);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(0,0,5, 0,0,0, 0,1,0);
}

void motion(int x, int y) {
accel=( sqrt(abs(y-yprev)*abs(y-yprev)+abs(x-xprev)*abs(x-xprev)) )/30;
if(st==1)accel=0.5;
if (x>xprev) hor=xprev/x;
else hor=-xprev/x;
if (y>yprev) ver=yprev/y;
else ver=-yprev/y;
spin=spin+accel;
yprev=y;
xprev=x;
}

void mouse(int button, int state, int x, int y) {
 if (state==GLUT_DOWN) {
     st=1;
     accel=0;
     xprev=x;
     yprev=y;
 }
 else st=0;
}



при кручении мышей дёргается. как исправить?

Автор: MrCherry 3.2.2007, 13:21
совсем никто такую мелочь не знает? smile 

Автор: sgi1981 6.2.2007, 04:14
Здравствуй, дружище !
Чего ты добиваешься ?
Ты хочешь управлять мышью ?

Если это так, то учти, что 
1) при работе с матрицей рисования модели 
функции такие как 
glRotatef - поворачивают систему отсчета рисования модели относительно оси, проходящей через центр системы отсчета рисования модели, причем направление поворота против часовой стрелки относительно наблюдателя на которого направлен вектор оси поворота;
glTranslatef - перемещают систему отсчета рисования модели в точку на которую указывает радиус-вектор, который задан относительно этой же системы отсчета рисования модели.

2) при работе с матрицей системы координат камеры
функции такие как 
glRotatef - поворачивают систему координат камеры относительно оси, проходящей через центр глобальной системы отсчета, причем направление поворота по часовой стрелке относительно наблюдателя на которого направлен вектор оси поворота;
glTranslatef - перемещают систему координат камеры в точку на которую указывает радиус-вектор, который задан относительно глобальной системы координат.

Поэтому при вращении камеры функцией glRotatef камера будет вращаться вокруг оси проходящей через центр глобальной системы координат, но не вокруг оси системы координат самой камеры.

Допустим имеется персонаж которым ты управляешь и камера для него.
Тогда существует такая прямая, которая проходит через этого персонажа и параллельна оси Y глобальной системы координат. Назовем эту прямую "прямая g". Имеются оси локальной системы координат камеры.
То в ответ на изменение горизонтальной координаты указателя мыши системы координат камеры должна поворачиваться вокруг прямой g на угол пропорциональный изменению горизонтальной координаты указателя мыши.
В ответ на изменение вертикальной координаты указателя мыши системы координат камеры должна поворачиваться вокруг оси X системы координат камеры на угол пропорциональный изменению вертикальной координаты указателя мыши.

Если при изменении горизонтальной координаты мыши камеру вращать вокруг оси Y локальной системы координат камеры, и при изменении вертикальной координаты мыши камеру вращать вокруг оси X локальной системы координат камеры, то "при кручении мышей" у тебя камера постепенно повернется вокруг оси Z своей системы координат  ;-)  ;-) . Поверь мне. У меня есть небольшой опыт в этом.

Если тебе нужен набор функций для управления камерой мышью, то я могу их тебе тут прислать...

Добавлено @ 04:17 
Здравствуй, дружище !
Чего ты добиваешься ?
Ты хочешь управлять мышью ?

Если это так, то учти, что 
1) при работе с матрицей рисования модели 
функции такие как 
glRotatef - поворачивают систему отсчета рисования модели относительно оси, проходящей через центр системы отсчета рисования модели, причем направление поворота против часовой стрелки относительно наблюдателя на которого направлен вектор оси поворота;
glTranslatef - перемещают систему отсчета рисования модели в точку на которую указывает радиус-вектор, который задан относительно этой же системы отсчета рисования модели.

2) при работе с матрицей системы координат камеры
функции такие как 
glRotatef - поворачивают систему координат камеры относительно оси, проходящей через центр глобальной системы отсчета, причем направление поворота по часовой стрелке относительно наблюдателя на которого направлен вектор оси поворота;
glTranslatef - перемещают систему координат камеры в точку на которую указывает радиус-вектор, который задан относительно глобальной системы координат.

Поэтому при вращении камеры функцией glRotatef камера будет вращаться вокруг оси проходящей через центр глобальной системы координат, но не вокруг оси системы координат самой камеры.

Допустим имеется персонаж которым ты управляешь и камера для него.
Тогда существует такая прямая, которая проходит через этого персонажа и параллельна оси Y глобальной системы координат. Назовем эту прямую "прямая g". Имеются оси локальной системы координат камеры.
То в ответ на изменение горизонтальной координаты указателя мыши системы координат камеры должна поворачиваться вокруг прямой g на угол про%

Добавлено @ 04:17 
Здравствуй, дружище !
Чего ты добиваешься ?
Ты хочешь управлять мышью ?

Если это так, то учти, что 
1) при работе с матрицей рисования модели 
функции такие как 
glRotatef - поворачивают систему отсчета рисования модели относительно оси, проходящей через центр системы отсчета рисования модели, причем направление поворота против часовой стрелки относительно наблюдателя на которого направлен вектор оси поворота;
glTranslatef - перемещают систему отсчета рисования модели в точку на которую указывает радиус-вектор, который задан относительно этой же системы отсчета рисования модели.

2) при работе с матрицей системы координат камеры
функции такие как 
glRotatef - поворачивают систему координат камеры относительно оси, проходящей через центр глобальной системы отсчета, причем направление поворота по часовой стрелке относительно наблюдателя на которого направлен вектор оси поворота;
glTranslatef - перемещают систему координат камеры в точку на которую указывает радиус-вектор, который задан относительно глобальной системы координат.

Поэтому при вращении камеры функцией glRotatef камера будет вращаться вокруг оси проходящей через центр глобальной системы координат, но не вокруг оси системы координат самой камеры.

Допустим имеется персонаж которым ты управляешь и камера для него.
Тогда существует такая прямая, которая проходит через этого персонажа и параллельна оси Y глобальной системы координат. Назовем эту прямую "прямая g". Имеются оси локальной системы координат камеры.
То в ответ на изменение горизонтальной координаты указателя мыши системы координат камеры должна поворачиваться вокруг прямой g на угол про%

Автор: MrCherry 8.2.2007, 20:11
это то я кажись понял.. я просто не могу понять как сделать чтобы когда клавиша мыши нажата - предмет двигается за движением мыши, а при отпускании - сохранял ускорение. ускорение сохраняет, но при нажатой мыши предмет дрыгается при изменении направления движения мыши

Автор: sgi1981 9.2.2007, 00:43
Ну так с самого начала надо было так и писать, что ты хочешь объекты перемещать.
Я не буду задумываться над твоим кодом, потому что необходима конкретная постановка задачи перемещения мышью объектов.

Автор: Rickert 9.2.2007, 23:15
MrCherry, для начала советую не использовать GLU функции для инициализации OGL'а.
Ищи в Яндексе "Уроки NeHe"
Учись по ним - и поймёшь то, как надо работать со всем этим.

Автор: MrCherry 9.2.2007, 23:38
ты про glut? от него отказался... хотя неокончательно.. надо обмыслить..
nehe давно уже находил, ща прошёл шесть уроков, втыкаю, но хочется вот эту крутилку заставить работать, а потом может как нить открувание 3ds приделать.. ну это чисто для практики..

Автор: Rickert 10.2.2007, 00:00
Так ты раз с Нех знаком - с ним и работай. А глут вообще забудь - это для лентеяв

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)