Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> help opengl! не получается... 
:(
    Опции темы
MrCherry
Дата 2.2.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2006

Репутация: нет
Всего: нет



Код

#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;
}



при кручении мышей дёргается. как исправить?
PM MAIL   Вверх
MrCherry
Дата 3.2.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2006

Репутация: нет
Всего: нет



совсем никто такую мелочь не знает? smile 
PM MAIL   Вверх
sgi1981
Дата 6.2.2007, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



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

Если это так, то учти, что 
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 на угол про%
PM MAIL   Вверх
MrCherry
Дата 8.2.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2006

Репутация: нет
Всего: нет



это то я кажись понял.. я просто не могу понять как сделать чтобы когда клавиша мыши нажата - предмет двигается за движением мыши, а при отпускании - сохранял ускорение. ускорение сохраняет, но при нажатой мыши предмет дрыгается при изменении направления движения мыши
PM MAIL   Вверх
sgi1981
Дата 9.2.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



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



--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Rickert
Дата 9.2.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
MrCherry
Дата 9.2.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2006

Репутация: нет
Всего: нет



ты про glut? от него отказался... хотя неокончательно.. надо обмыслить..
nehe давно уже находил, ща прошёл шесть уроков, втыкаю, но хочется вот эту крутилку заставить работать, а потом может как нить открувание 3ds приделать.. ну это чисто для практики..
PM MAIL   Вверх
Rickert
Дата 10.2.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1173 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.