2010-08-09 5 views
2

Я играю с OpenGL ES на iPhone, и я пытаюсь повернуть модель путем панорамирования пальцем. Я обнаружил приложение Molecules с открытым исходным кодом, которое позволяет вам это делать, и я смотрю на этот код, но когда дело доходит до поворота моей модели, я могу повернуть ее только в точке, находящейся далеко в пространстве (например, это было на орбите как спутник, и я - неподвижная планета). Любое предложение о том, что может быть неправильным? я могу отправить код позже, может быть, по запросу (количество строк) По большей части относятся к молекулам вы можете найти его здесь MOLECULESOpenGL ES: Вращающаяся 3d модель вокруг себя

ответ

4

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

Я думаю, что есть функция glTranslate(), скажем, что объект находится в 1,0,0. Затем вы должны перевести на -1,0,0, чтобы перейти к исходному. Это переводит вектор, идущий от центра объекта к началу координат.

+0

Как я могу перевести его в начало? Я думаю, что я на 0,0,0, а объект стоит на некоторых координатах, я пытался перевести даже внутри модели (я вижу только половину ее), но он держится на одном уровне. Простите меня, я полный noob , – rano

+0

Я обновил свой ответ выше с помощью примера перевода. Если вы считаете себя новичком OpenGL, я помню, как многому научился из учебников «NeHe» при первом использовании OpenGL. Урок 10 (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=10) показывает, как перемещаться по 3D-миру (прокручивать бит за загрузкой моделей) –

+0

@ S.C. Мэдсен: Я понял, что все, что мне нужно сделать, это перевести обратно количество, которое я сначала перевел. Но я не могу это сделать, я загружаю модель (поэтому я предполагаю, что его вершины имеют определенные координаты, и он не помещается в исходное состояние), чем я делаю некоторые gltranslate() и glRotate для перемещения «камеры» (I знать, что сцена движется), чтобы модель была на вид устройства. Поэтому я предполагаю, что я делаю что-то неправильно в отношении перспективы или системы координат. – rano

3

код ничья, вероятно, выглядит примерно так:

glLoadIdentity(); 
glTranslate(0, 0, -10); 
glRotate(...); 
drawMolecule(); 

Теперь важно понимать, что эти преобразования применяются в обратном порядке. Если в drawMolecule, мы указываем вершину, то эта вершина будет первым быть повернут вокруг оси заданной на glRotate (который по определению проходит через местного происхождения молекулы), и затем быть переведено 10 единиц в направление -z.

Это имеет смысл, потому что glTranslate по существу означает: «перевести все, что приходит после этого». Это включает в себя вызов glRotate, поэтому результат вращения также переводится. Если бы обращения были отменены, результат перевода был бы повернут, что приведет к вращению вокруг оси, которая больше не проходит через начало координат.

Нижняя строка: повернуть объект вокруг его местного происхождения, поставить glRotateвызов последней.

+0

Похоже, что все преобразования идут в стек – rano

+0

Да и нет. Когда вы пишете это так, происходит то, что текущая матрица преобразования просто умножается на матрицу вращения/перевода, которую вы указали, и нет возможности вернуться к предыдущей матрице (если вы не примените обратное преобразование, но с округлением ошибка, нет способа убедиться). Однако OpenGL * имеет * матричный стек: вы можете явно сохранить и восстановить текущую матрицу с помощью 'glPushMatrix' и' glPopMatrix'. Матрицей сверху стека является текущая матрица; Матрицы ниже, на которые вообще не смотрят. – Thomas

+0

Хорошо, я понял, что тот факт, что порядок имеет значение, заключается в премультипликации двух матриц, не имеющих коммутативного свойства – rano

Смежные вопросы