Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #30 : 08-02-2009 16:46 » |
|
во первых, тут все на "ты" ) во вторых - это всё лишь теория, так как до практики у меня руки так и не дошли ещё (всё мечтаю...), проверить всё на првктике - твоя задача
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #31 : 09-02-2009 19:35 » |
|
Тема неожиданно начила своё продолжение.
Я решил проверить а действительно ли после совмещения координат центра куба и координат центра мира координаты куба не миняются, оказались что меняются. Куб встоёт ровно по центру.
Я проверял так: 1. Закомментировал всё что относится к повороту. 2. Запустил программу и сравнил рассояния с права от куба и слева от куба они одинаковые.
Так что координаты куба надо возвращать обратно, но как это сделать.
|
|
« Последнее редактирование: 11-02-2009 08:03 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #32 : 09-02-2009 20:14 » |
|
zuze, непонятно, как ты это проверил, что координаты меняются
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #33 : 09-02-2009 20:16 » |
|
если ты не пересчитываешь сам координаты объекта, то он никогда не меняется, он всегда постоянен. Немного поправлю. После установки мировой матрицы, все следующие объекты рисуются с использованием этой матрицы. Если не ошибаюсь, то: имеются координаты мира - объект изначально описан в этой системе координат. Функция SetTransform позволяет изменить систему координат мира (при этом не затрагивается сам объект). Относительно этой же системы координат задаётся просмотр (== камера) У объекта есть СВОИ координаты, у мира директ икса свои. Если матрица мира единичная, эти координаты совпадают. После того, как ты написал pDevice->SetTransfor(WORLD, &world); Координаты всех точек умножаются на эту матрицу, и рисуются в мире директа. Приведу пример. Ты нарисовал сферу в 3д максе, с центром (0,0,0) и радиусом 1 и загрузил сетку в программу. Применяя матрицу s 0 0 0 0 s 0 0 0 0 s 0 x y z 1 Шар сдвигается на (х,у,z) и растягивается в s раз. Потом всё это проецирутся на экран, в зависимости от настроек камеры. Еще: Всегда устанавливай матрицу мира, перед тем как нарисовать объект, т.к. неизвестно, какая матрица мира сейчас установлена.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #34 : 09-02-2009 20:19 » |
|
Надеюсь прояснил немного:)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #35 : 09-02-2009 20:20 » |
|
это всё понятно, я это и имею в виду - сам объект то не меняется, а матрицы накладываются картой перед выводом на экран
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #36 : 09-02-2009 20:28 » |
|
Я понял что сам объект (куб) не меняется, если у объекта (куба) координаты центра не 0,0,0 то я так думал расстояние с лева и справа от него должны быть разные, а они одинаковые.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #37 : 09-02-2009 20:34 » |
|
Я решил проверить а действительно ли после совмещения координат центра куба и координат центра мира координаты куба не миняются, оказались что меняются. Куб встоёт ровно по центру. Бред какой-то. А ты что хотел? Я понял что сам объект (куб) не меняется, если у объекта (куба) координаты центра не 0,0,0 то я так думал расстояние с лева и справа от него должны быть разные, а они одинаковые. Может стоит с камерой повозится? zuze, а чего ты хочешь добиться, меняя координаты?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #38 : 09-02-2009 20:40 » |
|
Вот я задаю объект (куб) вершинами я так как его центр объекта (куба) x = 5.0f, y = 0.6f, z = 4.1f, то он должен выводится на экран правее центра и вертеться, а получается так мы передвигаем объект (куб) в центр экрана и заставляем его вертеться.
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #39 : 09-02-2009 21:20 » |
|
А ты хочешь заставить его вертеться вокруг центра координат?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #40 : 09-02-2009 21:39 » |
|
Нет, вокруг своего центра.
Но у нас получается так: 1. Переносим объект (куб) в центр экрана (это мы делаем только из-за того чтобы куб вращался вокруг своего центра) 2. Задаём вращение 3. Выводим на экран
А должно быть так: 1. Переносим объект (куб) в центр экрана (это мы делаем только из-за того чтобы куб вращался вокруг своего центра) 2. Задаём вращение 3. Переносим обратно 4. Выводим на экран
Вот как сделать 3-ий шаг?
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #41 : 09-02-2009 21:52 » |
|
Ты путаешь пространство мира и пространство объекта. Центр объекта - всегда(0,0,0). А объект вращается вокруг осей Ox, Oy, Oz, опять же, своего пространства.
Если хочешь, могу скинуть свой проект, там настроена камера, может будет проще. Но нужна 2008-я студия.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #42 : 09-02-2009 22:01 » |
|
А тогда так объясню С помощью функции SetTransfor переносим объект допустим в вехней части экрана в право, т.е. он находится вверхней части экрана с права. То по коду который я сделал выходит следующие, что объект (куб) перемещается в центр экрана и начинает вертеться во круг центра мира, а надо чтобы объект (куб) вертелся во круг своего центра находясь в правом верхнем углу экрана.
Это я для примера взял что объект (куб) находится в правом верхнем углу экрана, он может быть где угодно.
|
|
« Последнее редактирование: 09-02-2009 22:42 от zuze »
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #43 : 09-02-2009 22:20 » |
|
начинает вертеться во круг своего центра, а надо чтобы объект (куб) вертелся во круг своего центра
Объяснил. Может ты сначала устанавливаешь матрицу, которая вращает, а потом ту, которая перещает? Выложи код, который сейчас есть.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #44 : 09-02-2009 22:53 » |
|
Я хотел сказатьначинает вертеться во круг центра мира (у нас совпадают центры мира и куба), а надо чтобы объект (куб) вертелся во круг своего центра. Вот код// Глобальная переменная DWORD OneTick = 0; // Установка матриц преобоазования void Matrix(void) { // Мировая матрица D3DXMATRIX MatrixWorld; // Матрица перемещения D3DXMATRIX MatrixTranslation; // Матрица вращения D3DXMATRIX MatrixRotation; // Матрица вида D3DXMATRIX MatrixView; //матрица проекции D3DXMATRIX MatrixProjection; float fAngle; float BeginAngle; float rps; UINT iTime; D3DXMatrixIdentity(&MatrixWorld); BeginAngle = D3DX_PI/4.0f; rps = 0.05f; iTime = GetTickCount();
if(!OneTick) OneTick = iTime; fAngle = BeginAngle + (iTime - OneTick) * (D3DX_PI * 2.0f * rps / 1000.0f);
// Поворот D3DXMatrixRotationY(&MatrixRotation, fAngle); // Перемещаем мировую матрицу D3DXMatrixTranslation(&MatrixTranslation, -5.0f, -0.6f, -4.1f); D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation); // Устанавливаем мировую матрицу pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);
// Изменяем видовую матрицу D3DXMatrixLookAtLH(&MatrixView, // полученная в итоге видовая матрица &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим &D3DXVECTOR3(0.0f, 0.0f, 0.0f), // куда смотрим &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха // Устанавливаем видовую матрицу pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView); // Изменяем матрицу проекции D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции D3DX_PI/4, // поле зрения в направлении оси Y в радианах 1.54f, // соотношения сторон экрана 770/500=1.54 10.0f, // передний план отсечения сцены 200.0f); // задний план отсечения сцены // Устанавливаем матрицу проекции pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection); }
Это будет заментно на примере таком1. Перенести куб в верхний правый угол (к примеру) 2. Через какое-то время (например 10 секунд) заставить объект (куб) вертется во круг своего центра И мы увидим что объект (куб) переместился в центр экрана, так как мы совмещаем координаты центра куба и координаты центра мира, а без совмещения нельзя заставить объект вертется во круг своего центра, какой-то замкнутый круг получается.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #45 : 10-02-2009 04:26 » |
|
zuze, а для чего тебе есть вот это ? D3DXMatrixLookAtLH(&MatrixView, // полученная в итоге видовая матрица &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим &D3DXVECTOR3(0.0f, 0.0f, 0.0f), // куда смотрим &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #46 : 10-02-2009 08:30 » |
|
// Поворот D3DXMatrixRotationY(&MatrixRotation, fAngle); // Перемещаем мировую матрицу D3DXMatrixTranslation(&MatrixTranslation, -5.0f, -0.6f, -4.1f); D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation); // Устанавливаем мировую матрицу
Попробуй заменить на: D3DXMatrixRotationY(&world, fAngle); world.41 = x world.42 = y world.43 = z pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld); а для чего тебе есть вот это ? Давай еще камеру вокруг куба будем вертеть.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #47 : 10-02-2009 10:08 » |
|
Вот я сделал два куба один куб находится в центре экрана и вращаеется вокруг центра своей оси. Второй находиться левее и выше первого куба и он не вращаеться.
Я хочу чтобы оба вращались каждый во круг своего центра, но вы говорите что без совмещения координат центра куба и координат центра мира это невозможно.
И что же происходит когда я совмещаю, второй куб накладывается на первый и визуально видно что вращается один куб во круг своей оси находящейся в центре экрана.
А должно быть так что 1. Первый куб должен вращаться вокруг своего цента в центре экрана. 2. Второй куб должен вращаться вокруг своего цента находясь левее и выше первого куба.
Для лучшего понимания прилагаю архив 2Cube.rar с файлами: Два куба один вертиться один нет 1. Cube3DnotZ-buffer_1.cpp код программы 2. Cube3DnotZ-buffer_1.exe исполняемый файл Два куба, оба вертится, но они накладываются друг на друга 1. Cube3DnotZ-buffer_2.cpp код программы 2. Cube3DnotZ-buffer_2.exe исполняемый файл
|
|
« Последнее редактирование: 11-02-2009 08:05 от Алексей1153++ »
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #48 : 10-02-2009 17:34 » |
|
zuze, читай Ответ #46.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #49 : 10-02-2009 19:17 » |
|
Вот я сделал как Вы сказали, но кубы всёравно наложились друг на друга// Установка матриц преобоазования void Matrix1(void) { // Мировая матрица D3DXMATRIX MatrixWorld; // Матрица перемещения //D3DXMATRIX MatrixTranslation; // Матрица вращения D3DXMATRIX MatrixRotation; // Матрица вида D3DXMATRIX MatrixView; //матрица проекции D3DXMATRIX MatrixProjection; float fAngle; float BeginAngle; float rps; UINT iTime;
D3DXMatrixIdentity(&MatrixWorld);
BeginAngle = D3DX_PI/4.0f; rps = 0.05f; iTime = GetTickCount();
if(!OneTick) OneTick = iTime; fAngle = BeginAngle + (iTime - OneTick) * (D3DX_PI * 2.0f * rps / 1000.0f);
// Поворот D3DXMatrixRotationY(&MatrixRotation, fAngle); // Перемещаем мировую матрицу MatrixWorld._41 = -5.0f; MatrixWorld._42 = -0.6f; MatrixWorld._43 = -4.1f; pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);
// Устанавливаем мировую матрицу pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);
// Изменяем видовую матрицу D3DXMatrixLookAtLH(&MatrixView, // полученная в итоге видовая матрица &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим &D3DXVECTOR3(0.0f, 0.0f, 0.0f), // куда смотрим &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха // Устанавливаем видовую матрицу pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView); // Изменяем матрицу проекции D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции D3DX_PI/4, // поле зрения в направлении оси Y в радианах 1.54f, // соотношения сторон экрана 770/500=1.54 10.0f, // передний план отсечения сцены 200.0f); // задний план отсечения сцены // Устанавливаем матрицу проекции pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection); }
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #50 : 10-02-2009 20:39 » |
|
Думать надо... И внимательно читать посты. Иначе травы не хватит, чтобы тебя понять У тебя столько матриц, что я сам запутался. Исправил и всё закрутилось, как оно должно. Я так понял, что ничего про матрицы не понимаешь. Прикрепил свой проект, посмотри, как там матрицы используются, может поймешь. Лёха, лучше не качай, всё равно не запустится и не скомпилится.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #51 : 10-02-2009 21:03 » |
|
Антон__, дык евойные вот проекты я запускал А вот твои не выходило почему то. А качать щас не буду, потом буду, когда разбираться продолжу
|
|
|
Записан
|
|
|
|
Антон__
|
|
« Ответ #52 : 10-02-2009 21:16 » |
|
Ну так скачай 2008-ю студию и мои будут запускаться, и windows 7, чтобы точно всё было хорошо
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #53 : 11-02-2009 07:33 » |
|
Выкладываю в архиве код и исполняемый файл (наконец всё нормально вертиться).
У меня только некоторые вопросы: 1. Почему я должен перемещать и вращать объекты (кубы) в функции рендеринга, а не в функции матриц преобразований. 2. Почему объекты (кубы) подсвечиваются, раньше же не подсвечивались.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #54 : 11-02-2009 07:51 » |
|
кубы не подсвечиваются, это ты просто цвета у вертиксов разные задал, задай все одинаковые
|
|
« Последнее редактирование: 11-02-2009 08:07 от Алексей1153++ »
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #55 : 11-02-2009 07:58 » |
|
Ой да у последней вершины другой цвет, подправил теперь нормально. Остался только вопросик "Почему я должен перемещать и вращать объекты (кубы) в функции рендеринга, а не в функции матриц преобразований?"
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #56 : 11-02-2009 08:10 » |
|
zuze, Антоха подправит, если я не прав, но тут происходит как раз то, что позволяет не работать с вертиксами объекта напрямую (да ещё и с каждым вертиксом) - перед рендером объекта ты говоришь карте, что нужно взять исходный описанный объект, наложить на него последние установленные матрицы преобразований и вывести на экран. При этом исходный объект не меняется
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #57 : 11-02-2009 11:10 » |
|
Вот сделал код с двумя функциями "матриц преобразований" и в них уже перемещение и вращение объекта. Оказалось дело в том что в коде из ответа №10 маленькая ошибка, а мы столько мучались. Код из ответа №10// Установка матриц преобоазования void Matrix(void) { // Мировая матрица D3DXMATRIX MatrixWorld; // Матрица перемещения D3DXMATRIX MatrixTranslation; // Матрица вращения D3DXMATRIX MatrixRotation; // Матрица вида D3DXMATRIX MatrixView; //матрица проекции D3DXMATRIX MatrixProjection; // Ось вращения - вектор D3DXVECTOR3 axis; float fAngle; float BeginAngle; float rps; UINT iTime; D3DXMatrixIdentity(&MatrixWorld); BeginAngle = D3DX_PI/4.0f; rps = 0.05f; iTime = GetTickCount();
if(!OneTick) OneTick = iTime; fAngle = BeginAngle + (iTime - OneTick) * (D3DX_PI * 2.0f * rps / 1000.0f);
// Поворот D3DXMatrixRotationY(&MatrixRotation, fAngle); // Перемещаем мировую матрицу D3DXMatrixTranslation(&MatrixTranslation, 0.0f, 0.0f, 0.0f); D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation); pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld);
// Изменяем видовую матрицу D3DXMatrixLookAtLH(&MatrixView, // полученная в итоге видовая матрица &D3DXVECTOR3(0.0f, 0.0f, 80.0f), // точка, из которой смотрим &D3DXVECTOR3(0.0f, 0.0f, 0.0f), // куда смотрим &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); // направление верха // Устанавливаем видовую матрицу pDirect3DDevice->SetTransform(D3DTS_VIEW, &MatrixView); // Изменяем матрицу проекции D3DXMatrixPerspectiveFovLH(&MatrixProjection, // полученная итоговая матрица проекции D3DX_PI/4, // поле зрения в направлении оси Y в радианах 1.54f, // соотношения сторон экрана 770/500=1.54 10.0f, // передний план отсечения сцены 200.0f); // задний план отсечения сцены // Устанавливаем матрицу проекции pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MatrixProjection); }
Надо было в место D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation); написать D3DXMatrixMultiply(&MatrixWorld, &MatrixRotation, &MatrixTranslation); Это можно проверить подставив в мой код который я прикрепил в этом ответе в функции Matrix1 в место D3DXMatrixMultiply(&MatrixWorld, &MatrixRotation, &MatrixTranslation); функцию D3DXMatrixMultiply(&MatrixWorld, &MatrixTranslation, &MatrixRotation); и Вы увидите что второй куб начнёт вращаться не вокруг своего центра. Конешно хотелось понять почему так происходит с кубом, если так перемножаем матрицы он так вращаеться, а если наоборот перемножаем матрицы он иначе вращаеться?С математической точки зрения это понятноА - матрица В - матрица А*В не равняеться В*А
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #58 : 11-02-2009 11:25 » |
|
сам же и ответил А*В не равняеться В*А
а насчёт " двумя функциями "матриц преобразований" " , тебе надо свойство к объекту присобачить - где он сейчас и на какой угол повёрнут. Тогда для любого объекта будет автоматически считаться
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #59 : 11-02-2009 11:35 » |
|
Вы имеете ввиду у функции Matrix сделать параметры?
А на счёт матриц, если надо объект повернуть вокруг своего центра, то MatrixRotation*MatrixTranslation, а если надо объект вращать вокруг какого-то центра на экране, то MatrixTranslation*MatrixRotation.
То есть в каком порядке перемножать матрицы можно считать что это справочная информация? Как бы это мне ещё по подробней понять почему в этих случаях так умножаем, а в других иначе?
|
|
« Последнее редактирование: 11-02-2009 11:42 от zuze »
|
Записан
|
|
|
|
|