Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Локальные системы координат


Автор: Staxxx 20.2.2011, 13:04
Всем привет!! Меня озадачила одна ситуация! когда я начал изучать компьютерную графику я не смог понять как устроены локальные системы координат smile 

прошу Вас помочь мне!! покажите на примере из DirectX Sample Browser: Tutorial 3 как будет выглядеть в коде вращение двух треугольников в разных осях вращения  smile  smile 

пока я только понял место, где нужно это сделать +) 
Код

//-----------------------------------------------------------------------------
// Name: InitGeometry()
// Desc: Creates the scene geometry
//-----------------------------------------------------------------------------
HRESULT InitGeometry()
{
    // Initialize three vertices for rendering a triangle
    CUSTOMVERTEX g_Vertices[] =
    {
        { -1.0f,-1.0f, 0.0f, 0xffff0000, }, // сам треугольник
        {  1.0f,-1.0f, 0.0f, 0xff0000ff, },
        {  0.0f, 1.0f, 0.0f, 0xffffffff, },


    };

    // Create the vertex buffer.
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3 * sizeof( CUSTOMVERTEX ),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }

    // Fill the vertex buffer.
    VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof( g_Vertices ), ( void** )&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof( g_Vertices ) );
    g_pVB->Unlock();

    return S_OK;
}




и это место:

Код

VOID Setuptest1()
{
    // For our world matrix, we will just rotate the object about the y-axis.
    D3DXMATRIXA16 matWorld;

    // Set up the rotation matrix to generate 1 full rotation (2*PI radians) 
    // every 1000 ms. To avoid the loss of precision inherent in very high 
    // floating point numbers, the system time is modulated by the rotation 
    // period before conversion to a radian angle.
    UINT iTime = timeGetTime() % 1000;
    FLOAT fAngle = iTime * ( 2.0f * D3DX_PI ) / 1000.0f;
    D3DXMatrixRotationY( &matWorld, fAngle );
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );


    // Set up our view matrix. A view matrix can be defined given an eye point,
    // a point to lookat, and a direction for which way is up. Here, we set the
    // eye five units back along the z-axis and up three units, look at the
    // origin, and define "up" to be in the y-direction.
    D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    // For the projection matrix, we set up a perspective transform (which
    // transforms geometry from 3D view space to 2D viewport space, with
    // a perspective divide making objects smaller in the distance). To build
    // a perpsective transform, we need the field of view (1/4 pi is common),
    // the aspect ratio, and the near and far clipping planes (which define at
    // what distances geometry should be no longer be rendered).
    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

}


прошу помочь немного апгрейдить код)))

Спасибо всем, кто откликнеться))

Добавлено @ 13:19
   легким движением руки я добавил еще один треугольник

Код

    CUSTOMVERTEX g_Vertices[] =
    {
        { -1.0f,-1.0f, 0.0f, 0xffff0000, }, // сам треугольник
        {  1.0f,-1.0f, 0.0f, 0xff0000ff, },
        {  0.0f, 1.0f, 0.0f, 0xffffffff, },


        {  1.2f, 0.0f, 0.0f, 0xffff0000, }, // еще один
        {  1.4f, 0.0f, 0.0f, 0xff0000ff, },
        {  1.3f, 1.0f, 0.0f, 0xffffffff, },
    };



теперь шаг за вами,
помогите создать ему свою ось вращения, чтобы он стал самостоятельным треугольником =))))

прикрепил сам проект

Модератор: используйте подсветку кода

Автор: BorisVorontsov 21.2.2011, 21:54
Для того, что бы объект на сцене трансформировался, то есть, изменил свой вид и позицию в трехмерной сцене, к нему или применяют мировую матрицу, или преобразования на уровне вершин. В данном примере применена мировая матрица с поворотом вокруг оси Y, вертикальной оси в начале координат. Что бы задать вращение вокруг произвольной оси, тебе надо заменить D3DXMatrixRotationY на D3DXMatrixRotationAxis, а для того, что бы каждый примитив трансформировался по-своему, надо перед его отрисовкой применять соответствующим образом трансформированную матрицу методом SetTransform

Автор: Staxxx 21.2.2011, 22:01
Спасибо BorisVorontsov !!!! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)