Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод объектов разного размера 
V
    Опции темы
Andrey44
Дата 15.6.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Всем здравствуйте.
С кажу сразу, я в 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


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 15.6.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



 smile спасибо разобрался уже. Сделал скалинг матрицы.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
BorisVorontsov
Дата 16.6.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 1
Всего: 10



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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Andrey44
Дата 16.6.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



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

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

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


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Andrey44
Дата 16.6.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Я вот тут набросал кое что, но не доделал, как доделать, подскажите пожалуйста что делать дальше
Код

       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();


Это сообщение отредактировал(а) Andrey44 - 16.6.2009, 10:44


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
BorisVorontsov
Дата 16.6.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 1
Всего: 10



Лучше вот так
Код

    //Тут ты производишь все манипуляции с матрицей для объекта...
    //Матрица может быть мировой, а может быть просто локальной, исключительно для меша
    
    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
Код не проверял, но вроде должен работать

Это сообщение отредактировал(а) BorisVorontsov - 16.6.2009, 17:25


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Andrey44
Дата 17.6.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



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);
    }

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

Это сообщение отредактировал(а) Andrey44 - 17.6.2009, 08:13


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
BorisVorontsov
Дата 17.6.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 1
Всего: 10



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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
Andrey44
Дата 17.6.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



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

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



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
BorisVorontsov
Дата 17.6.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 1
Всего: 10



Масштабирование с поворотом вокруг собственного центра, например...


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.