[opengl] провращать объект

Kent1331

Прошу помоч, сам я уже бошку сломал.
есть объект, его нужно провращать на опр. угол по оси X и на опр. угол по оси Y
по понятным причинам
glRotatef(12,1.0,0.0,0.0);
gtRotatef(10,0.0,1.0,0.0);
неподходит, ось Y смещается и в итоге вторая уже вращает "не по" Y
кто нибудь подскажите как это решить.
Почитал про квантанионы, недогнал как их заюзать в данном случае.

procenkotanya

ось Y смещается
Или может объект поворачивается/смещается? Всё относительно ;)
> —
> "Расширь своё сознание"

bleyman

Прошу помоч
Мягкий знак, motherfucker, do you speak it?
неподходит, ось Y смещается и в итоге вторая уже вращает "не по" Y
Вращай вначале по Y, хуле.
Если тебе и это не подходит, то ты сам не понимаешь, что тебе нужно и что вообще суть вращение.

spensnp

ну очевидный вариант - делать второй поворот относительно повернутой в обратную сторону оси Y [0,cos(a -sin(a)], где "a" - угол поворота относительно X

okis

Почитай ещё про yaw-pitch-roll, для них есть готовые формулы

Kent1331

Чтото я совсем туплю, подскажите как быть.
Есть шарик. Он катается по полю. Координаты шарика вычисляются один раз, поэтому катание идет методом glRoutef;
подскажите как сделать катание реалистичным.

okis

> glRoutef;
glRotatef ?
Я так понимаю, у тебя текстурированный шарик, раз так хочется его вращать?
Катится он примерно так же, как и колесо. Находишь расстояние, угол поворота, поворачиваешь шарик. Для удобства можно перемещать систему координат так, чтобы шарик всё время оставался в начале координат.

Kent1331

Ты правильно понял, так и делается.
НО все хорошо пока шарик катится по прямой, а как только направление меняется, вращение перестает быть адекватным.
З.Ы. катается по 2-х мерному полю

nawok

Может так:
glTranslatef в начало координат
glRotatef как надо
glTranslatef обратно

tima56

Я в свое время делал это так:
В каждом кадре относительно предыдущего кадра шарик катится по прямой. Находим ось вращения и угол.
Храним матрицу преобразования, задающую суммарное (от начала анимации) вращение шарика. Изначально она единичная. На каждом шаге умножаем ее на полученную матрицу поворота, и сохраняем.
Если лень писать всю матричную арифметику, то glMultMatrixf, glGet(GL_MODELVIEW_MATRIX, ...) и glRotatef тебе в помощь.

Devid

Хороший совет, кстати. Я так делал управление вращением трехмерного объекта с клавы.

margadon

только точность от многократного умножения матриц сильно пострадает - лучше при возможности пользоваться углами Эйлера и не парить мозг
а вообще матрица поворота на произвольный угол в инете валяется - с её помощью можно сделать что угодно :)

Serab

что вообще суть вращение.
суть — множественное от есть, motherfucker, do YOU speak it?

Devid

только точность от многократного умножения матриц сильно пострадает
Я проверял определитель - он оставался близким к 1, даже стал ближе, чем в начале (в начале была не единичная матрица поворота). Ортогональность не проверял, но думаю с ней тоже все ок.

Kent1331

огромное спасибо за помощь. я осилил это. шарик катается как надо.
Решение такое:
glLoadIdentity;
c = sqrt(angley* angley + anglex* anglex);
glRotatef(c*360, -angley/c, anglex/c, 0.0);
glMultMatrixfGLfloat*)view_matrix);
glGetFloatv(GL_MODELVIEW_MATRIXGLfloat*) view_matrix);

glLoadIdentity;
glTranslatef(x, y, 0.0);
glMultMatrixfGLfloat*)view_matrix);

Если есть конкретные предложение как это можно оптимизировать, то подскажите пжлст.
Хотя работает шустро, но мне кажется что извлечение матриц - дорогая операция...

Devid

Если у тебя это делается раз в кадр, то это мелочи.
Оставить комментарий
Имя или ник:
Комментарий: