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


Автор: Andrey44 15.6.2009, 11:00
Всем здравствуйте.
С кажу сразу, я в 3Д человек новый так что не судите если вопросы пустяковые или не смогу внятно объяснить.
Вопрос в следующем
Я хочу внутри куба нарисовать определенный объект
сначала я рисую объект а потом куб. Если я рисую куб и внутри него куб но меньшего размера, все хорошо, но если я хочу нарисовать 
что-либо другое например Mesh загруженый из *.Х файла у меня этот объект очень большой и не влазит в мой куб да и в окно тоже.
Что-бы его было видно хорошо, я делаю
Код

D3DXVECTOR3 position(0.0f, 0.0f, 220.0f);
    D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
    D3DXMATRIX V;
    D3DXMatrixLookAtLH(&V, &position, &target, &up);

    _pd3dDevice->SetTransform(D3DTS_VIEW, &V);

    // установка матрицы проекции
    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
        &proj,
        D3DX_PI * 0.5f, // 90 градусов
        (float)WND_WIDTH / (float)WND_HEIGHT,
        1.0f,
        1000.0f);
    _pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj);
    D3DXMATRIX matWorld;
    D3DXMATRIX matTrans;
    D3DXMATRIX matTrans1;
    D3DXMATRIX matRot;
    D3DXMATRIX invMatr;

    D3DXMatrixTranslation( &matTrans, 0.0f, 0.0f, 0.0f );
    D3DXMatrixTranspose( &matTrans1, &matTrans );

    D3DXMatrixRotationYawPitchRoll( &matRot, 
        D3DXToRadian(_fRotAngle), 
        D3DXToRadian(_fRotAngle), 
        0.0f );
    matWorld = matRot * matTrans;

    if( FAILED(_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ) ) )
        return E_FAIL;
Но после этого не видно моего большого куба, как я понял - 
он уходит вдаль и его не видно. Как мне это исправить.
Спс. smile

Автор: Andrey44 15.6.2009, 14:45
 smile спасибо разобрался уже. Сделал скалинг матрицы.

Автор: BorisVorontsov 16.6.2009, 09:26
Ты лучше мировую матрицу транслируй, а не перенаправляй матрицу вида. А еще лучше, пройдись по всем вершинам меша и трансформируй их координаты в соответствии с мировой отмасштабированной и транслированной матрицей. Все равно один раз грузишь, проблем потом будет меньше

Автор: Andrey44 16.6.2009, 09:43
Цитата(BorisVorontsov @  16.6.2009,  09:26 Найти цитируемый пост)
А еще лучше, пройдись по всем вершинам меша и трансформируй их координаты в соответствии с мировой отмасштабированной и транслированной матрицей. Все равно один раз грузишь, проблем потом будет меньше 

А как это сделать? В смысле (трансформируй их координаты)

Добавлено через 2 минуты и 27 секунд
Гружу из файла функцией D3DXLoadMeshFromX она возвращает ID3DMash из него я могу получить указатель на буфер, из которого потом могу получить указатель на данные и проходя в цикле по всем вершинам, что-то с ними делать? Или как? И что с ними делать?

Автор: Andrey44 16.6.2009, 10:00
Я вот тут набросал кое что, но не доделал, как доделать, подскажите пожалуйста что делать дальше
Код

       IDirect3DVertexBuffer9Ptr vertPtr;
    _pMeshCytovirus->GetVertexBuffer(&vertPtr);
    BYTE *data;
    unsigned int dataSize = _pMeshCytovirus->GetNumBytesPerVertex()*_pMeshCytovirus->GetNumVertices();
    vertPtr->Lock(0, dataSize, (void**)&data, 0);
    
    NormalVertex *ver;
    for(unsigned int i = 0; i < _pMeshCytovirus->GetNumVertices(); i++)
    {
        ver = (NormalVertex *)data+_pMeshCytovirus->GetNumBytesPerVertex()+i;

    }
    vertPtr->Unlock();

Автор: BorisVorontsov 16.6.2009, 16:34
Лучше вот так
Код

    //Тут ты производишь все манипуляции с матрицей для объекта...
    //Матрица может быть мировой, а может быть просто локальной, исключительно для меша
    
    LPBYTE pPtr = NULL;
    LPD3DXVECTOR3 pVertex;

    DWORD dwNumVertcs = pMeshCytovirus->GetNumVertices();
    DWORD dwVertexSize = D3DXGetFVFVertexSize(pMeshCytovirus->GetFVF());

    if (SUCCEEDED(pMeshCytovirus->LockVertexBuffer(0, (LPVOID *)&pPtr))) {
        for (DWORD i = 0; i < dwNumVertcs; i++) {
            //Тут уже трансформируем каждую вершину меша в соответствии с матрицей
            pVertex = (LPD3DXVECTOR3)pPtr;
            D3DXVec3TransformCoord(pVertex, pVertex, &_твоя_матрица_);
            pPtr += dwVertexSize;
        }
        pMeshCytovirus->UnlockVertexBuffer();
    }


Добавлено @ 16:36
Код не проверял, но вроде должен работать

Автор: Andrey44 17.6.2009, 08:12
BorisVorontsov, спасибо за подсказку, но сделал немного не так.
Код

LPBYTE pPtr = NULL;
    DWORD dwNumVertcs = _pMeshCytovirus->GetNumVertices();
    DWORD dwVertexSize = D3DXGetFVFVertexSize(_pMeshCytovirus->GetFVF());
    if (SUCCEEDED(_pMeshCytovirus->LockVertexBuffer(0, (LPVOID *)&pPtr))) {
        for (DWORD i = 0; i < dwNumVertcs; i++) {
            ((LPD3DXVECTOR3)pPtr)->x*=0.007f;
            ((LPD3DXVECTOR3)pPtr)->y*=0.007f;
            ((LPD3DXVECTOR3)pPtr)->z*=0.007f;
            pPtr += dwVertexSize;
        }
        _pMeshCytovirus->UnlockVertexBuffer();
        if(_pMeshCytovirus->GetFVF() & D3DFVF_NORMAL)
            D3DXComputeNormals(_pMeshCytovirus, 0);
    }

Спасибо за наводку в нужную сторону.

Автор: BorisVorontsov 17.6.2009, 11:08
Ну, если тебе только отмасштабировать нужно, то ладно. Для более сложных манипуляций лучше воспользоваться матрицей

Автор: Andrey44 17.6.2009, 11:17
Цитата(BorisVorontsov @  17.6.2009,  11:08 Найти цитируемый пост)
Ну, если тебе только отмасштабировать нужно, то ладно. Для более сложных манипуляций лучше воспользоваться матрицей

Если не сложно, какие есть более сложные манипуляции?

Автор: BorisVorontsov 17.6.2009, 13:33
Масштабирование с поворотом вокруг собственного центра, например...

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