GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (259 стр.)

Сообщения на форуме пользователя Andrey (259 стр.)

glRotatef - и анимация16 авг. 200411:11#1
pp
Привет я тоже анимацией решил заниматься.Программирую графику недолго.

Я думаю ты смешал все в одну кучу.Тебе нужно определиться  вот с чем:
1.По каким событиям производить анимацию вращения
2.Относительно какого вектора вращать
3.На какой угол вращать

У тебя все 3 поворота в одной куче поэтому возможно она у тебя неправильно вращается
и получаются дергания

А на счет Scale Если объект большой попробуй вызвать Scale(7,7,7); тогда он увеличиться в 7 раз,если маленький попробуй вызвать Scale(1/7,1/7,1/7); тогда он уменьшится в 7 раз

Вопросы по камере16 авг. 200410:59#0
Всем привет вот долго мучаюсь не могу ни к чему прийти.Смотрел многие примеры но там
везде по разному не судите пожалуйста начинающего так строго.

Камера представлена 4 векторами (смысл их я думаю понятен)
Right
Up
Direction

Position - позиция

для изменения позиции камеры я меняю вектор Position

Для вращения камеры используется метод:

void Camera::Rotate(Point2D &point)
{
	const GLfloat kx = 30; //Масштаб угла по x
	const GLfloat ky = 30;//Масштаб угла по у
	anX = point.r0 / kx;
	anY = point.r1 / ky;

	AngleX += anX;     //Угол вращения в плоскости X0Z
	AngleY += anY;     //	Угол вращения в плоскости Y0Z

	GLfloat CosX = GLfloat(cos(AngleX));
	GLfloat CosY = GLfloat(cos(AngleY));
	GLfloat SinX = GLfloat(sin(AngleX));
	GLfloat SinY = GLfloat(sin(AngleY));

	Direction -> x = SinX * CosY;
	Direction -> z = CosX * CosY;
	Direction -> y = SinY;

	Up -> x = - SinX * SinY;
	Up -> z = - CosX * SinY;
	Up -> y = CosY;
	*Right = (*Direction) * (*Up);	//Векторное произведение 2 вектотров дает
                                                               //3-й перпендикулярный вектор
}

Матрица камеры формируется следующим образом:

//Установка матрицы камеры
void Camera::SetMatrix()
{
       Direction -> Normalize();
       Right -> Normalize();
       Up -> Normalize();
       Matrix -> Matrix[0][0] = Right -> x;
       Matrix -> Matrix[1][0] = Up -> x;
       Matrix -> Matrix[2][0] = - Direction -> x;
       Matrix -> Matrix[3][0] =  Position -> x;
       Matrix -> Matrix[0][1] = Right -> y;
       Matrix -> Matrix[1][1] = Up -> y;
       Matrix -> Matrix[2][1] = - Direction -> y;
       Matrix -> Matrix[3][1] = 0;
       Matrix -> Matrix[0][2] = Right -> z;
       Matrix -> Matrix[1][2] = Up -> z;
       Matrix -> Matrix[2][2] = - Direction -> z;
       Matrix -> Matrix[3][2] = Position -> z;
       Matrix -> Matrix[0][3] = 0;
       Matrix -> Matrix[1][3] = 0;
       Matrix -> Matrix[2][3] = 0;
       Matrix -> Matrix[3][3] = 1;
}

Отрисовка сцены:

//Отображения сцены
void Render::DrawScene(ListScene *&listScene)
{
      //....
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
      camera -> SetMatrix();
      glMultMatrixf(camera -> GetMatrix());
     //...
}

  Вопрос 1

      Камера "Летает"  если после передвижения мыши вверх или вниз изменить вектор
      Position (нажимая клавмищи впред назад)
      Мне нужно сделать так чтобы она только ходила в плоскости X0Z.т.е. после того как
      передвинуть мышь вверх или вниз и нажав клавиши вверх вниз ,она меняла бы только
      направления  взгляда,но не "летала" по направлению взгляда.

    Т.е. как во многих играх переместив мышку вверх вниз камера просто поворачивается
      вверх или вниз.Но у меня она двигается тогда вверх или вниз

    Вопрос 2

    Если камеру делать на кватернионах то Вектор Position как я понял остается,а повороты
    камеры запдаются кватернионом?

  Спасибо заренее
  С Уважением Андрей

самый первый вопрос16 авг. 200410:39#10
Andius
Библиотеки лучше вот так подключать не надо в опциях проекта ни чего устанавливать
//Подключение библиотек OpenGL
#pragma comment( lib, "opengl32.lib" ) // сама Библиотека OpenGL
#pragma comment( lib, "glu32.lib" )      //Библиотека утилит OpenGL
#pragma comment( lib, "glaux.lib")       //Дополнтительная библиотека OpenGL
Вопрос по Скелетной анимации13 авг. 200410:57#6
Ну что больше никто не сможет помочь?
Проекту нужны участники13 авг. 20049:34#30
Jihar
Я хочу присоеденится.Занимаюсь 3D графикой нексколько месяцев.Пробую писать свой первый движок.
Вот посмотри уровень знаний по этим ссылкам
http://www.gamedev.ru/download/?id=1130
http://www.gamedev.ru/download/?id=1094
потом скажи где я могу поучавствовать.

Правка: 13 авг. 2004 9:34

Помогите с читыкой файла13 авг. 20049:02#1
Virtual Maestro
Я вот так попробовал работает
#include <fstream.h>

void main()
{
float flot=0;

ofstream fout;
ifstream fin;

fout.open("C:\\test.dat",ios::binary);           Пиши \\ - два слэша
for (int i=0;i<200;i++)
{
fout<<flot;
flot+=0.5;
}
fout.close();

fin.open("C:\\test.dat",ios::binary);// Пиши \\ - два слэша

int number=153;
float res;

fin.seekg(number*4,ios::beg);
fin>>res;
fin.close();

cout<<res;
return 0;
}

А что имеется ввиду под бредом?

У меня выводит -1.07374e+008 Это научная запись числа Тебе я так понял что-бы в "нормальном" виде выдавало надо? Почитай про формат вывода например в MSDN
Нужно поставить число точек после запятой.И все будет выводиться.

Правка: 13 авг. 2004 9:03

Вопрос по Скелетной анимации13 авг. 20048:44#5
haze
Спасибо за ответ.Только у меня родитель/потомок joint'а задается числом.И вместо списка -массив.Но это конечно мелочи.Только не совсем понятно Как это все в коде организовать может скажешь какую часть кода прислать?Я в Асю к тебе постучался можно и там поговорить.
Вопрос по Скелетной анимации12 авг. 200420:11#2
_restless_
Да ты меня прекрасно понял!!!
Дак проблема в том что я не знаю как их вычислять я знаю что надо их перемножать
В соответствиис родителями и потомками.Значит надо зделать перегрузку операции
  * для класса матрица? А это же очень напрягать процессор будет.

  Вот для камеры например 1 матрица ее можно вычислить,а для каждого joint'а это же куча
  циклов 4х4 !!!!

Или по другому нельзя?

Вопрос по Скелетной анимации12 авг. 200419:48#0
Привет всем.

              Программирую на Visual C++ 6.0, API - OpenGL

Я пробую программировать скелетную анимацию на основе статьи:
http://www.gamedev.ru/articles/?id=30112

                                Вот мой подход к этому

Объект для анимаци представляет собой скелет,поделенный на части.

1. Создал класс Object - объект для анимации.

2. В нем есть абстрактный класс PartBody - часть тела

3. В этом классе есть массив joint'ов,т.к. от этого класса будет наследоваться классы:
                Рука,Нога,Туловище.
        Массив joint'ов взят из тех соображений что для каждого из перечисленных классов
        число joint'ов различно.Поэтому в конструкторе классов создается массив с заранее
      известным  числом joint'ов.Наприме для Руки 3 join'а: joint плеча,joint предплечья,
      joint кисти и т.д.(В общем идея понятна :) )

4. Каждый joint как известно состоит из 4 векторов (как и камера например):
      X            - ось X        (Right)
      Y            - ось Y        (UP)
      Z            - ось Z        (Direction)
      Position  - позиция
    У каждого joint'а есть своя матрица преобразований.

                                Реализация

При инициализации класса Object "метрвым" joint'ом  является joint туловища его я и привязываю к мировой системе координат

  Относительно его я собираю Моего "Человечика". Человечек пока простой,состоящий из
  сфер и цилиндриков.Сборка происходит путем установки частей тела,относительно друг
  друга
                                Реализация сборки
                            Установка Рук:
          1. Получаем позицию туловища.
          2. Относительно него перемещаем два плеча.(Изменяя вектор Position плеча)
              Также поворачиваем его изменяя вектора Y,X
          3. Относительно векторов плечей перемещаем два предплечья.(Изменяя вектор
        Position предплечья)
              Также поворачиваем его изменяя вектора Y,X
          4. Относительно вектора предплечья  перемещаем две кисти.
                (Изменяя вектор Position кисти)
                            Также поворачиваем их изменяя вектора Y,X

                              Установка Ног:
          1. Получаем позицию туловища.
          2.  Относительно него перемещаем два бедра.(Изменяя вектор Position бедра)
              Также поворачиваем их вертикально изменяя вектор Y
        3. Относительно вектора бедра перемещаем две Голени.(Изменяя вектор Position
            голени)
              Также поворачиваем их вертикально изменяя вектор Y
        4. Относительно вектора бедра перемещаем двеСтопы.(Изменяя вектор Position
            стопы)
              Также поворачиваем их вертикально изменяя вектор Y

                                      Установка головы - смещение Position относительно туловища.

                  Я ничего в частях тела не упустил? :)

  Допустим установлена позиция объекта.
  Далее я в цикле для каждой части тела происходит отрисовка объекта.
  Как извеснто из изложенного выше часть тела - это класс с определенным числом joint'ов.
  Получается еще один цикл,где для каждого joint'а устанавливается соответствующая
  матрица (из его векторов),и потом она перемножается на видовую.

                                                      Дальше

  В начально положении при конструировании объекта,Задав любое
  положение "Человечек" рисуется правильно т.е. части тела не рисуются в разброс.

  Но если попытаться Обработать самое простое событие анимации - перемещение
  всего "Человечика" целиком ,т.е. не изменение положения его отдельных частей тела,
  то он разлитается на части,начинаю крутиться  все части тела которые,устанавливалиись
  в самом начале.

                                              Соображения по этому поводу
  Я знаю это типичная проблема.Я знаю что я неправильно работаю с матрицами.
  Я хочу чсе это попробовать пока без Квантирионов.


                                            Вопрос

  Как  Сделать чтобы он рисовался правильно при обработке перемещения целиком?


    Помогите пожалуйста.Заранее спасибо

  С Уважением Андрей

Вышла спецификация OpenGL 2.012 авг. 200414:28#1
R0_man
Я знал что OpenGL оссобо от DirectX не будет отставать в развитии и возможностях
lib to cpp?12 авг. 200412:55#7
Dusk
Народ прав, если в Assembler'е волокешь,может и поймешь внутренность.Но вот перевести
этот дизасемблированный код с помощью того-же популяоного дизассемблера IDA в C++ очень сложно и теоретичеки невозможно.Да и перевестись может в разных вариантах.Какой из них будет оригиналом неизвестно все зависит от того под какой компилятор хочется перевести и с реализации какого программиста хотелось увидить исходник на C++
хелп. начинаю изучать OpenGL6 авг. 200416:19#6
progman
В Понедельник прислать пример под MFC?
Не используй MFC  в играх.Это не для этого круга задач.
Как начать программировать скелетную аннимацию ?5 авг. 200420:10#5
Shura,L1fСпасибо ребята я буду пробывать
Как начать программировать скелетную аннимацию ?5 авг. 200412:31#2
Ну что мне никто не может подсказать?
3DS4 авг. 200419:16#1
TRI_FACELIST - нужно для нумерации вершин т.е. для отрисовки треугольников
                          также это нужно для текстурных координат

TRI_VERTEXLIST - а это сам массив вершин

вот тут про это хорошо расписано
http://www.gamedev.ru/articles/?id=40113&page=2

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр