Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3]  Все   Вниз
  Печать  
Автор Тема: Вращение куба в DirectX 9.  (Прочитано 83499 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #60 : 11-02-2009 12:27 » 

как в книжке сказано, так и умножай Улыбаюсь В общем случае - чтобы не запутаться, умножай всегда в одном порядке, сделай себе inline функцию для этого, наконец, чтоб в одном месте умножение было
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #61 : 11-02-2009 12:42 » 

Понял, спасибо.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #62 : 11-02-2009 12:51 » 

zuze, зачем ты умножаешь, если не знаешь, что это даёт?
Допустим тебе надо повернуть куб на углы alpha, beta, gamma вокруг осей Ox, Oy, Oz и переместить на (x0, y0, z0).
Какой твой вариант? Улыбаюсь
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #63 : 11-02-2009 12:58 » 

Умножение это объединение матриц.
Чтобы над объектом можно производить несколько трансформаций одновременно используя одну матрицу.
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #64 : 11-02-2009 15:11 » 

Кстати, перемножать матрицы можно так:
а = б*ц;
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #65 : 11-02-2009 15:14 » 

На моём компьютере если перемножатьь так а = б*ц; программа медленнее работает это видно, т.е. есть задержка перед выводом объектов.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #66 : 11-02-2009 16:04 » 

zuze, какое железо ? Улыбаюсь
Записан

Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #67 : 11-02-2009 16:17 » 

Лёха, у тебя тоже тормозит???
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #68 : 11-02-2009 16:28 » 

Антон__, не пробовал, но вряд ли будет разница с одним перемножением Улыбаюсь Вот и поинтересовался я его железками
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #69 : 11-02-2009 16:51 » 

У меня P3 750 Мгц, RAM 512МБ, GeForce FX 5700LE 128 МБ.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #70 : 11-02-2009 17:17 » 

И изза одного несчастного перемножения вне карты тормоза ? Странно.
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #71 : 11-02-2009 17:32 » 

У меня было два перемножения тогда.
Но это было такое не значительное торможение при прорисовки, можно сказать не торможение, а задержка. Так как во время выполнения ни чего не тормозило.
Записан
Evil_DarkMan
Гость
« Ответ #72 : 18-03-2009 17:52 » 

Ребят, по моему мне кажется, что не в железе дело!

   
Код:
HRESULT hr=pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &params, &pDevice);
- это в фанке Init3D, zure второй параметр попробуй поставь D3DDEVTYPE_REF (если конечно на C++ пишешь) - может помочь, у меня лажня тож подобная была, а вааще


Код:
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib");
#pragma comment(lib, "d3dx9d.lib");
#pragma comment(lib, "winmm.lib");
#include <math.h>
#include "libraries.h"
float angle, n;
#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZ|D3DFVF_DIFFUSE
LONG WINAPI WndProc (HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam);;
LPDIRECT3D9 pD3D=NULL;
LPDIRECT3DDEVICE9 pDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 pBuffVer = NULL;
struct CUSTOMVERTEX{
float x,y,z;
DWORD color;
//float nx, ny, nz;
};
HRESULT Init3D(HWND hwnd){
if(NULL==(pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS params;
ZeroMemory( &params, sizeof(params));
params.Windowed=TRUE;
params.SwapEffect=D3DSWAPEFFECT_DISCARD;
params.BackBufferFormat=D3DFMT_UNKNOWN;
HRESULT hr=pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &params, &pDevice);
if(FAILED(hr))
{
pD3D->Release();
pD3D=0;
return E_FAIL;
}
pDevice ->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pDevice ->SetRenderState(D3DRS_LIGHTING, FALSE);
pDevice ->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
}
VOID Delete3D()
{
if(pBuffVer!=NULL)
pBuffVer->Release();
if(pDevice!=NULL)
pDevice->Release();
if(pD3D!=NULL)
pD3D->Release();
}

HRESULT InitObj()
{
double pi = 3.1415926535;
CUSTOMVERTEX vers[]=
{
//First Object;
{-0.5, -0.5, 0, 0x000000ff},
{0.5, -0.5, 0, 0x00ff00ff},
{0, 0, 0, 0x0000f0ff},

{0, 0, 0, 0x000000ff},
{-0.5, -0.5, 0, 0x0000ff00},
{0, 0, -0.4, 0x000000ff},

{0, 0, 0, 0x000000ff},
{0.5, -0.5, 0, 0x0000ffff},
{0, 0, -0.4, 0x000000ff},

{0, 0, -0.4, 0x000000ff},
{0.5, -0.5, 0, 0x00f0ffff},
{-0.5, -0.5, 0, 0x000000ff},

};
if(FAILED(pDevice->CreateVertexBuffer(36*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pBuffVer, NULL)))
return E_FAIL;
VOID *pBV;
pBuffVer -> Lock(0, sizeof(vers), (void**) &pBV, 0);
memcpy(pBV, vers, sizeof(vers));
pBuffVer -> Unlock();
return S_OK;
}

VOID SetupMatrices(float x, float y, float angle)
{
D3DXMATRIXA16 matWorld;
    D3DXMATRIXA16 matWorldRotation;
    D3DXMATRIXA16 matWorldTranslation;

    D3DXMatrixRotationY( &matWorldRotation, angle);
   
    D3DXMatrixTranslation(&matWorldTranslation, x, y, 0);
   
    D3DXMatrixMultiply(&matWorld, &matWorldTranslation, &matWorldRotation);

    pDevice->SetTransform( D3DTS_WORLD, &matWorld );

    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 );
    pDevice->SetTransform( D3DTS_VIEW, &matView );

    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    pDevice->SetTransform( D3DTS_PROJECTION, &matProj );

    //D3DXMATRIXA16 matWorld;
    //// Вращение треугольника.
    //UINT  iTime  = timeGetTime() % 1000;
    //FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    //D3DXMatrixRotationY( &matWorld, fAngle );
    //pDevice->SetTransform( D3DTS_WORLD, &matWorld );
    //// Видовая матрица.
    //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 );
    //pDevice->SetTransform( D3DTS_VIEW, &matView );
    //// Матрица проекции.
    //D3DXMATRIXA16 matProj;
    //D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    //pDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

VOID DrawMyMesh(float x, float y, float angle)
{
    SetupMatrices(x, y, angle);
    pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);
}


void Render()
{
pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(128,128,0), 0.0f, 0);
if(SUCCEEDED (pDevice->BeginScene()))
{
// SetupMatrices();
pDevice -> SetStreamSource (0, pBuffVer, 0, sizeof(CUSTOMVERTEX));
    pDevice -> SetFVF (D3DFVF_CUSTOMVERTEX);
// Изменение смещения и угла поворота.
        n += 0.01;
        angle += 0.01;

        // Рисование 2-х объектов.
        DrawMyMesh(0, 0, angle);
        DrawMyMesh(0.5, n, -angle*10);
       
//pDevice -> DrawPrimitive (D3DPT_TRIANGLELIST, 0, 4);
pDevice -> EndScene();
}
pDevice -> Present(NULL, NULL, NULL, NULL);
}
  - это на тетраэдр, поменяй всё координаты на координаты куба и всё ништяк!)) Класс!

......и ещё, переменные n и angle поменяй под своё задание!
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #73 : 19-03-2009 05:20 » 

Цитата
Ребят, по моему мне кажется, что не в железе дело!
Тут более глобальная проблема - не хватает травы. Улыбаюсь

А если хочешь вращать 2 кубика, то устанавливаешь мировую матрицу, рисуешь куб, устанавливаешь вторую мировую матрицу, опять рисуешь тот же куб.
Записан
Evil_DarkMan
Гость
« Ответ #74 : 20-03-2009 04:54 » 

 Муки творчества... ...........ребят, а подскажите же как 2 разных объекта крутить, а то у мя чё-т мозга не хватило провернуть всё, что ты сказал Должен же быть выход!!!  Помогите!........сижу.....не фига не втыкаю!  Уже туплю
Записан
Evil_DarkMan
Гость
« Ответ #75 : 20-03-2009 05:07 » 

..........а куба два, или 2 одинаковых объекта вращать - эт как пальца обоссать!  Класс!




My Fox
Записан
Антон__
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #76 : 20-03-2009 07:47 » 

Алгоритм тот же.
1) ставишь мировую матрицу для первого объекта.
2) рисуешь первый объект.
3) ставишь мировую матрицу для второго объекта.
4) рисуешь второй объект.
5) Если не получилось, делаешь заново с пункта 1).
Записан
Evil_DarkMan
Гость
« Ответ #77 : 20-03-2009 10:34 » 

Ok, ща буду пробовать!))
Записан
Evil_DarkMan
Гость
« Ответ #78 : 20-03-2009 17:08 » 

Чёрт, нихрена не врубаю  Сколько об стенку не бейся... , слушайте, люди добрые, выложите код, кому не впадлу, pls!! Поторопись! Должен же быть выход!!!....оч надо бы поскорее....
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #79 : 21-03-2009 09:00 » 

Evil_DarkMan, если ты внимательно эту тему смотрел, то тут куча кода в аттачах ))
Записан

Evil_DarkMan
Гость
« Ответ #80 : 08-04-2009 05:05 » 

Лан, проехал! А со светом на примитивы, типа куба, кто-нить чё-нить посоветовать может??!!))  Спасите - тону!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #81 : 08-04-2009 07:44 » 

Evil_DarkMan, вот здесь начинали разбираться https://forum.shelek.ru/index.php/topic,18027.0.html
Записан

Страниц: 1 2 [3]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines