Страница: 1 |
Страница: 1 |
Вопрос: DirectX
Добавлено: 30.08.07 13:30
Автор вопроса: lexei | ICQ: 464882716
Как в DirectX вращаль один объект?
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Sneaks
Вопросов: 9
Ответов: 84
Профиль | | #1
Добавлено: 30.08.07 16:05
Так телепаты,напряглись .... думаем, что же хотел узнать автор ??? Так у кого какие соображения? Я думаю он имел ввиду D3D 8. Он самый популярный. Так как у него называется обьект .... Ладно давайте ответим кратко и что бы не было понятно )))
Ответ: Попробуй провернуть матрицу обьекта.
Номер ответа: 2
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #2
Добавлено: 31.08.07 00:01
Это как?
Вопрос вполне корректный. Не важно какой DX, даже если это OGL - принципы везде одинаковые.
У объекта не существует собственной матрицы. Существует мировая, видовая и матрица проецирования. И трансформации воздействуют на все объекты сцены.
Проблема, с которой столкнулся lexei банальна.
Трансформируя матрицу функцией - D3DXMatrixRotation (С++) у него вращаются все объекты.
Наиболее простые решения.
1. Установи еденичную матрицу после вращения.
D3DXMatrixIdentity.
2. Используй стек. Сохрани матрицу в стеке, произведи необходимые трансформации, а потом извлеки обратно.
Пример. Рисуем 2 системы координат,первая неподвижна в 3Д сцене, вторя вращается вместе с объектом.
S_tack->Push ();
// рисуем систему координат
if(coor)
if( SUCCEEDED( g_pd3dDevice->BeginScene()))
{
D3DXMATRIX pMatrix,m_pWorldMatrix;
D3DXMatrixMultiply(&pMatrix, &temp, &matView);
D3DXMatrixMultiply(&pMatrix, &pMatrix, &matProj);
C_Line->SetWidth (2.0f);
C_Line->Begin ();
C_Line->GetDevice(&g_pd3dDevice);
C_Line->rawTransform (li,2,&pMatrix,D3DCOLOR_XRGB(255,0,0,0));
C_Line->rawTransform (li1,2,&pMatrix,D3DCOLOR_XRGB(0,255,0,0));
C_Line->rawTransform (li2,2,&pMatrix,D3DCOLOR_XRGB(0,0,255,0));
C_Line->End ();
g_pd3dDevice->SetTransform( D3DTS_WORLD , &m_pWorldMatrix );
D3DXMatrixIdentity( &m_pWorldMatrix
D3DXMatrixMultiply(&pMatrix, &m_pWorldMatrix, &matView);
D3DXMatrixMultiply(&pMatrix, &pMatrix, &matProj);
C_Line->SetWidth (3.0f);
C_Line->Begin ();
C_Line->GetDevice(&g_pd3dDevice);
C_Line->rawTransform (li,2,&pMatrix,D3DCOLOR_XRGB(255,0,0,0));
C_Line->rawTransform (li1,2,&pMatrix,D3DCOLOR_XRGB(0,255,0,0));
C_Line->rawTransform (li2,2,&pMatrix,D3DCOLOR_XRGB(0,0,255,0));
C_Line->End ();
// End the scene
g_pd3dDevice->EndScene();
}
S_tack->Pop ();
Номер ответа: 3
Автор ответа:
lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #3
Добавлено: 31.08.07 08:15
Спасибо, Vito. А нельзя этот код привести для VB.NET, а то я в С++ не шарю
Номер ответа: 4
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #4
Добавлено: 31.08.07 13:48
На Vb.Net я не писал, на c# можно.
Впрочем они настолько похожи(вызов функций), что разобраться будет несложно.
1. Еденичная матрица.
worldMatrix = Matrix.Identity;
worldMatrix.Translate(new Vector3(1.5f, 0.0f, 2.0f));
matRot.RotateYawPitchRoll(fAngle, fAngle, fAngle);
device.Transform.World = Matrix.Multiply(matRot, worldMatrix);
Некий блок трансформаций.
device.VertexFormat = CustomVertex.PositionColored.Format;
device.DrawPrimitives(PrimitiveType.LineList, 0, 3);
Что-то рисуем.
Установим после него еденичну ю матрицу, и на следующие объекты данная трнсформация воздействовать не будет.
2. Стек.
s_tack.Push();
if (coor)
{
device.SetStreamSource(0, vertexCoor, 0);
device.VertexFormat = CustomVertex.PositionColored.Format;
device.DrawPrimitives(PrimitiveType.LineList, 0, 3);
}
s_tack.Pop();
Номер ответа: 5
Автор ответа:
lexei
ICQ: 464882716
Вопросов: 13
Ответов: 32
Профиль | | #5
Добавлено: 31.08.07 13:55
Спасибо
Номер ответа: 6
Автор ответа:
Sneaks
Вопросов: 9
Ответов: 84
Профиль | | #6
Добавлено: 31.08.07 14:48
ну то что во всех DX принцип одинаковый вопрос спрный. в 7 просто либо задаеш поворот или координаты (obj.orientation nothing, 1,0,0,0,1,0)
Номер ответа: 7
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #7
Добавлено: 31.08.07 18:06
Sneaks
В 7 не спец. Предпочитал OGL. И не только я.
Интересно что делает этот код?
И почему так много (или мало) цифр?
Номер ответа: 8
Автор ответа:
Sneaks
Вопросов: 9
Ответов: 84
Профиль | | #8
Добавлено: 01.09.07 00:29
первые 3 ориентация "куда смотрит" прямо обьек а еше 3 где верх обьекта
Номер ответа: 9
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #9
Добавлено: 01.09.07 22:38
Понятно.
То есть объект распологается по оси х (1,0,0), а его верх по у.
Если поменяем ориентацию - объект повернется.
Так?
И obj это некий массив вершин описывающий фигуру?
Но это не трансформация (включают вращение перемещение), это просто ориентация (установка положения) объекта в текущей системе координат.