Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/64: Рейтинг темы: голосов - 64, средняя оценка - 4.73
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 56
1

Поворот вокруг своей оси (blender)

12.01.2018, 12:49. Показов 12178. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Глупый вопрос, но всёравно задаю его.
Как повернуть объект вокруг своей оси?
(либо я чтото не понимаю..либо координаты blender не как следует сохраняет либо ещё что)
Задаю вопрос, т.к. многое в проге делал сам, И как полагается..не уверен в том, что всё работает на 100% правильно.
( делал парсинг obj файлов, создание индексов, удаление дублирования и тд. )
И вот. Открываю Blender. делаю модель мартышки из множества материалов (да и модель сферы тоже делал, которая расположена глобально по 0,0,0 в блендере).Делаю экспорт obj. И любуюсь, на то, что модель крутится вокруг 0 0 0 координаты.
А мне нужно чтоб она крутилась вокруг своей оси) Да я и понять не могу, почему модель крутится вокруг нулевой координаты. (ведь когда я в блендере создаю модель, то размещаю её по нулевой координате) . Ведь в программе модели будут иметь первоначально такиеже координате, как и в 3д редакторе? или нет?


Вот немного инфы о коде.
1) Сначала создаю матрицы перспективы.
2) Создаю матрицу вида.
2) Делаю матрицу модели еденичной.
5) Создаю матрицу модели
6) Перемножаю матрицы. модели на видовую. Далее на матрицу перспективы.
7) Данные в шейдер передаю...рисую...


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        /* создаём матрицу вила, для передачи в шейдер */
        create_view_matrix(Game_logo_obj.Logo_camera_obj.view_matrix);
 
 
        Matrix.setIdentityM(Game_logo_obj.Logo_camera_obj.model_matrix, 0);
 
        /* создаём матрицу модели */ // если данную строку закоментить, то объект будет просто по центру экрана
        create_model_matrix(Game_logo_obj.Logo_camera_obj.model_matrix);
 
 
        create_mvp_matrix(Game_logo_obj.Logo_camera_obj.projection_matrix,
                Game_logo_obj.Logo_camera_obj.view_matrix,
                Game_logo_obj.Logo_camera_obj.model_matrix,
                Game_logo_obj.Logo_camera_obj.MVP_matrix);  /* создаём MVP матрицу */
 
 
Рисуем...........
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static void create_view_matrix(float[] view_matrix)
    {
        float time = (float)(SystemClock.uptimeMillis() % TIME) / TIME;
        float angle = time  *  2 * 3.1415926f;
 
        // точка положения камеры
        float eyeX = 0;
        float eyeY = 0;
        float eyeZ = 2;
 
        // точка направления камеры
        float centerX = 0;
        float centerY = 0;
        float centerZ = 0;
 
        // up-вектор
        float upX = 0;
        float upY = 1;
        float upZ = 0;
 
        android.opengl.Matrix.setLookAtM(view_matrix, 0,    eyeX, eyeY, eyeZ,       centerX, centerY, centerZ,       upX, upY, upZ);
    }
 
 
 
    public static void create_model_matrix(float[] model_matrix) 
   {
        float angle = (float)(SystemClock.uptimeMillis() % TIME) / TIME * 360;
        Matrix.rotateM(model_matrix, 0, angle, 0f, 1, 0);
    }
 
 
 
    public static void create_mvp_matrix(float[] projection_matrix, float[] view_matrix, float[] model_matrix, float[] MVP_matrix )
    {
        multiplyMM(MVP_matrix, 0, view_matrix, 0, model_matrix, 0);
        multiplyMM(MVP_matrix, 0, projection_matrix, 0, MVP_matrix, 0);
    }
ну а в самом начале работы проги, создаётся матрица перспективы.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void create_projection_matrix(float[] projection_matrix, int width, int height)
    {
      
        float ratio = 1;
        float left = -1.0f;
        float right = 1.0f;
        float bottom = -1.0f;
        float top = 1.0f;
        float near = 2f;
        float far = 6;
 
 
        if (width > height) {
            ratio = (float) width / height;
            bottom *= ratio;
            top *= ratio;
        } else {
            ratio = (float) height / width;
            left *= ratio;
            right *= ratio;
        }
 
        Matrix.frustumM(projection_matrix, 0, left, right, bottom, top, near, far);
    }

Что с координатам объектов которые экспортируются из 3д редактора? (например сфера, чей центр находится в 0 0 0)
При загрузке в прогу, при том коде, что описал выше. Объект крутится вокруг 0 0 0 как-будто находится рядом, а должен находиться прям на данной координате (если координаты из 3д редактора, соответствуют тем, что в проге) и крутиться...вокруг своей оси?..или нет..
Объясните пожалуйста. Правильно ли вообще работаю с матрицами...и..главное..почему, модель крутится, вокруг нулевой координаты а не на ней..
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2018, 12:49
Ответы с готовыми решениями:

Не удается реализовать поворот елки вокруг своей оси по x и по у
У меня такая проблема, в OpenGL я почти ничего не понимаю, но ёлку реализовать получилось(не с...

Вращение планеты вокруг солнца, и вокруг своей оси
У меня есть Солнце, которое находиться в координатах(0.0.0), и нужно вращать планеты, как по...

Вращать сферу вокруг центра координат, и одновременно вращать ее вокруг своей оси
Всем привет! Долблюсь о стену второй день ( Суть в том, что мне необходимо вращать сферу вокруг...

Поворот объекта вокруг оси
Здравствуйте. Знаю что подобная тема уже поднималась на форуме, но интересующий меня ответ я не...

15
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
12.01.2018, 14:05 2
Лучший ответ Сообщение было отмечено rosten как решение

Решение

Да, есть такая проблема, что в Blender'е принята Z-Up система, а в OpenGL - Y-Up система, потому при импорте в свою программу модель оказывается не так ориентированна, как ожидаешь. Я приспособился. Я поворачиваю модель в Blender'е на '-90' вокруг X, делаю "Object" -> "Apply" -> "Rotation" -> и поворачиваю обратно на '90' градусов вокруг X (но уже не применяю поворот). После экспорта модель ориентирована нормально.
2
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 56
12.01.2018, 16:12  [ТС] 3
Охохо)
Спасибо за ответ!
(попробовал ручками позицию модели в блендере перенести) и теперь , объект ровно по центру, и крутится вокруг своей оси.

Сейчас буду методом тыка, пробовать методы экспортирования модели в блендере,с различными настройками.
Как обнаружится, корректная, отпишу в эту тему.
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
12.01.2018, 16:24 4
Вы не планируете использовать библиотеку OpenGL Mathematics (GLM) для работы с матрицами?

Что вы используете для создания окна? GLFW? GLUT? SFML? У меня есть пример загрузки текстурированной модели из Blender'а написанный на Python + GLFW. Я может переведу, допустим, под GLUT, или SDL2. Что вы используете?
0
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 56
12.01.2018, 17:51  [ТС] 5
А использую я , сам не знаю что. Единственное как делал OpenGL приложение , это тупо запускал android studio и в нём, на джаве, потихоньку помаленьку, пробую приложение делать.
А там, через GLSurfaceView создаю "окно для приложения" и кодю...не задумывался вообще, что именно окно рисует.

Насчёт библиотеки GLM.
Не планирую использовать. Т.к. пока не понимаю для чего она мне может понадобиться) ,ну и второе, я c++ не знаю.(не нравится на нём что-то делать).
Пока на java пишу, а там через класс Matrix можно делать преобразования. ( чтож делать... пока придётся этим пользоваться)

Насчёт загрузки текстурированной модели. А у меня уже готова она)
А за примеры, спасибо. Но мне они не принесут столько "полезности", сколько могбы из них почерпнуть..более начитанный человек. Я не знаю не Python ни C++ .
Мне лучше, когда в кратце объясняются общие принципы.
Наподобие:
1) Чтоб нарисовать фигуру, мы должны указать координаты всех треугольников, из которых состоит фигура.
2) С каждым пикселем, на этой фигуре, можно будет сделать всё что угодно.
3) Уменьшаем количество дублирований вершин. т.к. "меньше данных" лучше, для пересылки из памяти в память gpu + требуется меньше памяти для хранения "рабочих данных.
и тд...
А во) когда это писал, вспомнил. Что есть одна фундаментальная вещь, которую не понимаю.
Что такое ТЕКСТУРНЫЙ СЛОТ? ..как работать с ним знаю. Как грузить в него данные, в курсе.
А ЧТО ЭТО? так и не пойму. (везде упоминают...текстурный слот....это...это... и ничего по существу)
0
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
13.01.2018, 12:38 6
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я поворачиваю модель в Blender'е на '-90' вокруг X
а зачем? в настройках экспорта/импорта .OBJ файлов можно же выбирать оси "Forward" и "Up"
1
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
13.01.2018, 14:10 7
Цитата Сообщение от rao Посмотреть сообщение
а зачем? в настройках экспорта/импорта .OBJ файлов можно же выбирать оси "Forward" и "Up"
Я много экспериментировал, но мне так и не удалось выставить правильно. Этот способ запомнил, когда читал книгу Unity 5.x Animation Cookbook

If you are using Blender, make sure to rotate the rig -90 degrees in the X
axis, apply the rotation in Blender and then rotate it again, +90 degrees in
the X axis. The rotation of the rig in Blender should be: 90 X, 0 Y, and 0 Z.
Your model should be facing the -Y axis in Blender (when you change the
view to FRONT, you should see the face of your character). Blender and
Unity use different axes alignment: in Blender, Z is up and Y is back; in
Unity Z, is front and Y is up. This little trick solves the problem. Your
model after import should have 0 rotation and should be facing the Z axis.
It is important for moving objects (such as characters) and rig
configuration. If you don't do this, your model will have -90 X rotation
after the import.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
14.01.2018, 10:44 8
А что делать в чуть более сложном случае: мы хотим импортировать из блендера в OpenGL не только сам объект (т.е. модельные координаты), но и его текущую матрицу?
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
15.01.2018, 13:08 9
Может товарищей смутило выражение "текущая матрица"? (это кто такая? ). Ладно, сформулируем по-другому.

Вот заграбастали мы из блендера (или др пакета) матрицу и хотим ее задействовать в OpenGL, Ну ясно просто так она работать не будет, там же Z-up, а мы уже перевели модельные координаты в OpenGL. Как же ее конвертировать?
C++
1
2
3
4
5
typedef QMatrix4x4 Matrix;
Matrix BlenderMatrix2GL( const Matrix & blenderM )
{
   // Ваши действия ???
}
Кстати о переводе координат. Может проще переставить оси в коде импорта, напр
C++
1
2
3
double temp = position.y;
position.y = position.z;
position.z = -temp;
0
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 56
18.01.2018, 10:33  [ТС] 10
Господа) я до сих пор! не сделал нормальный импорт OBJ
Можете по шагам тупому объяснить? что в блендере указывать , чтоб модель в OpenGL нормально отображалась.

Java
1
2
3
4
        /* сохраняем координаты вершины */
        Vertex_obj.x = Float.parseFloat(tokens[1]);
        Vertex_obj.y = Float.parseFloat(tokens[2]);
        Vertex_obj.z = Float.parseFloat(tokens[3]);
Вот например есть модель, её размещаем по координатам 0 0 0
И делаем экспорт.
Что в Forward нужно указывать?
Что нужно указывать в UP ??

(У меня методом перебора так и не получилось нормально модель экспортировать. всё крутится вокруг "линии" .....а бывает, что просто какието стороны объекта, имеют не верные координаты! т.к. как-будто x или z..или y перепутаны местами!) Выглядит так, что "круг" отображается нормально и крутится вокруг своей оси,
при повороте на 90 градусов, он вытягивается, и потом снова уменьшается до нормальной формы круга (думаю тут z y както местами перепутаны..или чего ещё.)
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
18.01.2018, 11:48 11
http://www.opengl-tutorial.org... l-loading/
http://opengl-tutorial.blogspot.com/p/7.html
1
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 56
18.01.2018, 13:03  [ТС] 12
Естественно я это всё читал.
Вопрос остался темже.Что в блендере то нажимать, чтоб корректный экспорт был??
при условии что при парсинге obj файла, вершины расположены так x y z
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
18.01.2018, 14:15 13
Попробуйте в блендере ничего не нажимать
C++
1
2
3
Vertex_obj.x = Float.parseFloat(tokens[1]);
Vertex_obj.y = Float.parseFloat(tokens[3]);
Vertex_obj.z = -Float.parseFloat(tokens[2]);
0
23 / 5 / 1
Регистрация: 05.01.2017
Сообщений: 56
18.01.2018, 16:23  [ТС] 14
Не помогло (
видать снова придётся методом перебора пробовать.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
18.01.2018, 23:37 15
Цитата Сообщение от rosten Посмотреть сообщение
Не помогло (
а вы пробывали другой загрузчик моделей, матрицы другие пробуйте, возможно на другом заработает тогда будет причина понятная
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
19.01.2018, 09:36 16
Цитата Сообщение от rosten Посмотреть сообщение
Не помогло (
видать снова придётся методом перебора пробовать.
Должно помочь. Не суетитесь с вращением. Зайдите в блендер, создайте чайник, экспортируйте в obj "как есть", не тыкайте никаких опций. Загрузите чайник в OpenGL с новым кодом, он должен быть таким же как в бледере.

Добавлено через 8 минут
Да, ну и для вертексных нормалей то же самое
0
19.01.2018, 09:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2018, 09:36
Помогаю со студенческими работами здесь

Поворот вокруг произвольной оси в пространстве
Готовлюсь к экзамену, говорят препод ловит на всяких двусмысленностях и неправильных формулировках,...

Загадочный поворот вокруг оси x в OpenGL
Доброго времени суток всем. Мучаюсь над одной проблемой, а именно: поворот вокруг оси x с помощью...

Вращение объекта вокруг своей оси
Задаю вопрос впервые, так что попрошу не придираться к возможным ошибкам/недостатку инфы. Начал...

C# OpenTK Вращение камеры вокруг своей оси
Итак, я начал разбираться в OpenGL, выбрал язык C# и библиотеку OpenTk. Привожу код моего творения:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru