Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: softvito.narod2.ru
 Профиль | | #2
Добавлено: 31.08.07 00:01
Ответ: Попробуй провернуть матрицу обьекта. :)

Это как?:)

Вопрос вполне корректный. Не важно какой DX, даже если это OGL - принципы везде одинаковые.

У объекта не существует собственной матрицы. Существует мировая, видовая и матрица проецирования. И трансформации воздействуют на все объекты сцены.
Проблема, с которой столкнулся lexei банальна.
Трансформируя матрицу функцией - D3DXMatrixRotation (С++) у него вращаются все объекты.
Наиболее простые решения.
1. Установи еденичную матрицу после вращения.
D3DXMatrixIdentity.
2. Используй стек. Сохрани матрицу в стеке, произведи необходимые трансформации, а потом извлеки обратно.
Пример. Рисуем 2 системы координат,первая неподвижна в 3Д сцене, вторя вращается вместе с объектом.

g_pd3dDevice->SetTransform( D3DTS_WORLD ,  S_tack->GetTop () );
   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->;DrawTransform (li,2,&pMatrix,D3DCOLOR_XRGB(255,0,0,0));
C_Line->;DrawTransform (li1,2,&pMatrix,D3DCOLOR_XRGB(0,255,0,0));
C_Line->;DrawTransform (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->;DrawTransform (li,2,&pMatrix,D3DCOLOR_XRGB(255,0,0,0));
C_Line->;DrawTransform (li1,2,&pMatrix,D3DCOLOR_XRGB(0,255,0,0));
C_Line->;DrawTransform (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-сайт: softvito.narod2.ru
 Профиль | | #4
Добавлено: 31.08.07 13:48
А нельзя этот код привести для VB.NET, а то я в С++ не шарю

На Vb.Net я не писал, на c# можно.
Впрочем они настолько похожи(вызов функций), что разобраться будет несложно.
1. Еденичная матрица.

worldMatrix = Matrix.Identity;
worldMatrix.Translate(new Vector3(1.5f, 0.0f, 2.0f));
matRot = Matrix.Identity;
matRot.RotateYawPitchRoll(fAngle, fAngle, fAngle);
device.Transform.World = Matrix.Multiply(matRot, worldMatrix);

Некий блок трансформаций.

device.SetStreamSource(0, vertexCoor, 0);
device.VertexFormat = CustomVertex.PositionColored.Format;
device.DrawPrimitives(PrimitiveType.LineList, 0, 3);

Что-то рисуем.

Установим после него еденичну ю матрицу, и на следующие объекты данная трнсформация воздействовать не будет.

device.Transform.World = Matrix.Identity;

2. Стек.

device.SetTransform(TransformType.World, s_tack.Top);
           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-сайт: softvito.narod2.ru
 Профиль | | #7
Добавлено: 31.08.07 18:06
Sneaks

В 7 не спец. Предпочитал OGL.:) И не только я.
Интересно что делает этот код?
obj.orientation nothing, 1,0,0,0,1,0

И почему так много (или мало) цифр?

Ответить

Номер ответа: 8
Автор ответа:
 Sneaks



Вопросов: 9
Ответов: 84
 Профиль | | #8 Добавлено: 01.09.07 00:29
первые 3 ориентация "куда смотрит" прямо обьек а еше 3 где верх обьекта

Ответить

Номер ответа: 9
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #9
Добавлено: 01.09.07 22:38
первые 3 ориентация "куда смотрит" прямо обьек а еше 3 где верх обьекта

Понятно.
То есть объект распологается по оси х (1,0,0), а его верх по у.
Если поменяем ориентацию - объект повернется.
Так?
И obj это некий массив вершин описывающий фигуру?
Но это не трансформация (включают вращение перемещение), это просто ориентация (установка положения) объекта в текущей системе координат.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам