Я работаю над разработкой и анимированием неба с помощью кубика. Поверхности, за исключением «верхнего», движутся таким образом, чтобы следует за друг другу. Тем не менее, я никогда не мог понять, как адаптировать «верхнюю» часть к этому движению, и пока я отключил ее. Ниже приведен код того, как я это сделал. Направление «верхнего» отключено, потому что, когда я включаю его, оно отделяется от других поверхностей и скольжения, как если бы оно было одиноким. В то время как окружающие направления прокручиваются в одном направлении (справа слева и т. Д.), Я подумал о том, чтобы анимировать «верхнюю» текстуру, чтобы вращаться, как колесо, и сопоставить ее с другими текстурами. Но я не смог добиться успеха. < /P>
Я был бы очень рад, если бы вы могли помочь мне с этим. Или, если бы вы могли направить меня по ссылке, которая может помочь ... < /p>
Я использую текстуру Cross Sky 4x3. (4096x3072) < /p>
с любовью. < /P>
void CSkyBox::GetCrossUVCoordinates(int faceIndex, float& uMin, float& uMax, float& vMin, float& vMax)
{
const float texWidth = 4096.0f;
const float texHeight = 3072.0f;
const float faceWidth = texWidth / 4.0f;
const float faceHeight = texHeight / 3.0f;
float pixelOverlapU = 1.0f / texWidth;
float pixelOverlapV = 1.0f / texHeight;
int col = 0, row = 0;
switch (faceIndex)
{
case 0: // (+Z)
col = 2; row = 1;
break;
case 1: // (-Z)
col = 0; row = 1;
break;
case 2: // (-X)
col = 1; row = 1;
break;
case 3: // (+X)
col = 3; row = 1;
break;
case 4: // (+Y)
col = 1; row = 0;
break;
case 5: // (-Y)
col = 1; row = 2;
break;
default:
uMin = 0.0f; uMax = 1.0f;
vMin = 0.0f; vMax = 1.0f;
return;
}
float pxMinU = col * faceWidth;
float pxMaxU = (col + 1) * faceWidth;
float pxMinV = row * faceHeight;
float pxMaxV = (row + 1) * faceHeight;
uMin = (pxMinU / texWidth) + pixelOverlapU;
uMax = (pxMaxU / texWidth) - pixelOverlapU;
vMin = (pxMinV / texHeight) + pixelOverlapV;
vMax = (pxMaxV / texHeight) - pixelOverlapV;
}
< /code>
void CSkyBox::Render()
{
STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
STATEMANAGER.SetTexture(1, NULL);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
STATEMANAGER.SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorld);
static float fOffsetU = 0.0f;
static float fOffsetV = 0.0f;
const float fScrollSpeed = 0.0009f;
float fTime = timeGetTime() / 1000.0f;
fOffsetU = fmod(fTime * fScrollSpeed, 1.0f);
fOffsetV = fmod(fTime * fScrollSpeed, 1.0f);
// Doku transform matrisi oluştur
D3DXMATRIX matTexture;
D3DXMatrixIdentity(&matTexture);
matTexture._31 = fOffsetU;
matTexture._32 = 0.0f;
D3DXMATRIX matOldTexture;
STATEMANAGER.GetTransform(D3DTS_TEXTURE0, &matOldTexture);
STATEMANAGER.SaveTransform(D3DTS_TEXTURE0, &matOldTexture);
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matTexture);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
// Render Face
if (m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE)
{
CGraphicImageInstance* pFaceImageInstance = m_GraphicImageInstanceMap[m_Faces[0].m_strFaceTextureFileName];
if (!pFaceImageInstance)
{
TraceError("Skybox Face Texture NULL!");
return;
}
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
STATEMANAGER.SetTexture(0, pFaceImageInstance->GetTextureReference().GetD3DTexture());
for (unsigned int i = 0; i < 6; ++i)
{
if (i == 4) // (+Y)
{
// Animate: off
D3DXMATRIX matIdentity;
D3DXMatrixIdentity(&matIdentity);
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matIdentity);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
}
else
{
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matTexture);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
}
m_Faces.Render();
}
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSU);
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSV);
}
else
{
for (unsigned int i = 0; i < 6; ++i)
{
m_Faces.Render();
}
}
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
STATEMANAGER.RestoreTransform(D3DTS_TEXTURE0);
STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING);
STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_FOGENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... h-directx9
Как повернуть «верхнюю» текстуру неба с помощью DirectX9? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1745433823
Anonymous
Я работаю над разработкой и анимированием неба с помощью кубика. Поверхности, за исключением «верхнего», движутся таким образом, чтобы следует за друг другу. Тем не менее, я никогда не мог понять, как адаптировать «верхнюю» часть к этому движению, и пока я отключил ее. Ниже приведен код того, как я это сделал. Направление «верхнего» отключено, потому что, когда я включаю его, оно отделяется от других поверхностей и скольжения, как если бы оно было одиноким. В то время как окружающие направления прокручиваются в одном направлении (справа слева и т. Д.), Я подумал о том, чтобы анимировать «верхнюю» текстуру, чтобы вращаться, как колесо, и сопоставить ее с другими текстурами. Но я не смог добиться успеха. < /P>
Я был бы очень рад, если бы вы могли помочь мне с этим. Или, если бы вы могли направить меня по ссылке, которая может помочь ... < /p>
Я использую текстуру Cross Sky 4x3. (4096x3072) < /p>
с любовью. < /P>
void CSkyBox::GetCrossUVCoordinates(int faceIndex, float& uMin, float& uMax, float& vMin, float& vMax)
{
const float texWidth = 4096.0f;
const float texHeight = 3072.0f;
const float faceWidth = texWidth / 4.0f;
const float faceHeight = texHeight / 3.0f;
float pixelOverlapU = 1.0f / texWidth;
float pixelOverlapV = 1.0f / texHeight;
int col = 0, row = 0;
switch (faceIndex)
{
case 0: // (+Z)
col = 2; row = 1;
break;
case 1: // (-Z)
col = 0; row = 1;
break;
case 2: // (-X)
col = 1; row = 1;
break;
case 3: // (+X)
col = 3; row = 1;
break;
case 4: // (+Y)
col = 1; row = 0;
break;
case 5: // (-Y)
col = 1; row = 2;
break;
default:
uMin = 0.0f; uMax = 1.0f;
vMin = 0.0f; vMax = 1.0f;
return;
}
float pxMinU = col * faceWidth;
float pxMaxU = (col + 1) * faceWidth;
float pxMinV = row * faceHeight;
float pxMaxV = (row + 1) * faceHeight;
uMin = (pxMinU / texWidth) + pixelOverlapU;
uMax = (pxMaxU / texWidth) - pixelOverlapU;
vMin = (pxMinV / texHeight) + pixelOverlapV;
vMax = (pxMaxV / texHeight) - pixelOverlapV;
}
< /code>
void CSkyBox::Render()
{
STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_FOGENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG2);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
STATEMANAGER.SaveTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
STATEMANAGER.SetTexture(1, NULL);
STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
STATEMANAGER.SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorld);
static float fOffsetU = 0.0f;
static float fOffsetV = 0.0f;
const float fScrollSpeed = 0.0009f;
float fTime = timeGetTime() / 1000.0f;
fOffsetU = fmod(fTime * fScrollSpeed, 1.0f);
fOffsetV = fmod(fTime * fScrollSpeed, 1.0f);
// Doku transform matrisi oluştur
D3DXMATRIX matTexture;
D3DXMatrixIdentity(&matTexture);
matTexture._31 = fOffsetU;
matTexture._32 = 0.0f;
D3DXMATRIX matOldTexture;
STATEMANAGER.GetTransform(D3DTS_TEXTURE0, &matOldTexture);
STATEMANAGER.SaveTransform(D3DTS_TEXTURE0, &matOldTexture);
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matTexture);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
// Render Face
if (m_ucRenderMode == CSkyObject::SKY_RENDER_MODE_TEXTURE)
{
CGraphicImageInstance* pFaceImageInstance = m_GraphicImageInstanceMap[m_Faces[0].m_strFaceTextureFileName];
if (!pFaceImageInstance)
{
TraceError("Skybox Face Texture NULL!");
return;
}
STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
STATEMANAGER.SaveSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
STATEMANAGER.SetTexture(0, pFaceImageInstance->GetTextureReference().GetD3DTexture());
for (unsigned int i = 0; i < 6; ++i)
{
if (i == 4) // (+Y)
{
// Animate: off
D3DXMATRIX matIdentity;
D3DXMatrixIdentity(&matIdentity);
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matIdentity);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
}
else
{
STATEMANAGER.SetTransform(D3DTS_TEXTURE0, &matTexture);
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
}
m_Faces[i].Render();
}
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSU);
STATEMANAGER.RestoreSamplerState(0, D3DSAMP_ADDRESSV);
}
else
{
for (unsigned int i = 0; i < 6; ++i)
{
m_Faces[i].Render();
}
}
STATEMANAGER.SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
STATEMANAGER.RestoreTransform(D3DTS_TEXTURE0);
STATEMANAGER.RestoreRenderState(D3DRS_LIGHTING);
STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_FOGENABLE);
STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLOROP);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG1);
STATEMANAGER.RestoreTextureStageState(0, D3DTSS_COLORARG2);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79589304/how-to-rotate-the-top-sky-texture-with-directx9[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия