Были или нет американцы на Луне?
13,263,346 109,687
 

  CodeGrinder ( Слушатель )
25 дек 2009 01:39:13

Тред №175720

новая дискуссия Дискуссия  87

Цитата: Geek
+3 вам за труд.



+0 вы хотели сказать?Подмигивающий

Цитата: Geek
Кстати, на Ваших картинках Земля находится гораздо ближе к той позиции которую Зумер называл (2 градуса влево, 1 вниз). Получается какое-то различие в итогах. Какое-нибудь объяснение этому есть? Посмотрите на его картинку, там один диск на другой налезает, а у Вас - нет.



Не знаю откуда разница. Может быть фокусное расстояние другое (у меня 61.1 мм), или что-то ещё. Мне пришлось использовать картинки меньшего размера чем 4400х4600 (1959x2048), т.к. Direct3D не хотел корректно с ними работать. Разбивал на 50х50 тайлов, центральные кресты указал насколько мог точно, как и расстояние между ними, ну и картинки исходные выровнял чтобы кресты были на одних горизонталях/вертикалях. Тем не менее, это уже не важно. Если бы было важно можно было бы вообще попиксельно преобразовывать, но скорость упала бы очень сильно конечно. Ну, и конечно, мог что-то пропустить, хотя вроде всё и правильно. Ещё тут кое-что зависит от наклона горы, который лучше смотреть по 6-му снимку.

Это ключевые куски кода для отображения:

HRESULT CApp::render()
{
RECT rc;
GetClientRect(mWindow, &rc);
float aspect = (float)(rc.right-rc.left)/(rc.bottom-rc.top);
mD3DDevicePtr->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
mD3DDevicePtr->BeginScene();

// setup world, view and projection matrices
D3DXMATRIX world, view, projection;

D3DXMatrixLookAtLH( &view, &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
 &D3DXVECTOR3( 0.0f, 0.0f, 1.0f ),
 &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
mD3DDevicePtr->SetTransform( D3DTS_VIEW, &view );

D3DXMatrixPerspectiveFovLH( &projection, 46.894f * D3DX_PI / 180, aspect, 0.1f, 100.0f );
mD3DDevicePtr->SetTransform( D3DTS_PROJECTION, &projection );

// create material
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
mD3DDevicePtr->SetMaterial( &mtrl );

mD3DDevicePtr->SetRenderState( D3DRS_LIGHTING, TRUE );
mD3DDevicePtr->SetRenderState( D3DRS_AMBIENT, 0x00ffffff );

// set texture to render
BOOL texRendered = FALSE;
for (int i = 0; i < ARRAYSIZE(mImages); i++)
{
if (FALSE != mImages[ i ].Visible)
{
mD3DDevicePtr->SetTexture( 0, mImages[ i ].TexturePtr );
mD3DDevicePtr->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
mD3DDevicePtr->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
mD3DDevicePtr->SetRenderState(D3DRS_ALPHABLENDENABLE, texRendered);

D3DXMATRIX m1, m2, m3;
D3DXMatrixRotationZ(&m2, mImages[ i ].RotZ);
D3DXMatrixRotationX(&m3, mImages[ i ].RotX);
D3DXMatrixMultiply(&m1, &m2, &m3);
D3DXMatrixRotationY(&m2, mImages[ i ].RotY);
D3DXMatrixMultiply(&world, &m1, &m2);
mD3DDevicePtr->SetTransform( D3DTS_WORLD, &world );
renderPhoto(mImages[ i ].CrossX, mImages[ i ].CrossY, mImages[ i ].CrossDistX, mImages[ i ].CrossDistY, mImages[ i ].Focus, 50);
texRendered = TRUE;
}
}
mD3DDevicePtr->EndScene();
mD3DDevicePtr->Present(NULL, NULL, NULL, NULL);
return S_OK;
}

HRESULT CApp::renderPhoto(float CrossX, float CrossY, float CrossDistX, float CrossDistY, float Focus, int PartCount)
{
CUSTOMVERTEX *dataPtr = NULL;
int count = 2 * PartCount * PartCount;
int length = count * 3 * sizeof(*dataPtr);
LPDIRECT3DVERTEXBUFFER9 vbPtr;
if (SUCCEEDED(mD3DDevicePtr->CreateVertexBuffer(length, 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &vbPtr, NULL)))
{
if (SUCCEEDED(vbPtr->Lock(0, length, (void **)&dataPtr, 0)))
{
float focus2 = Focus*Focus;
// generate vertices
float yLast = 10 * -CrossY / CrossDistY;
float yLast2 = yLast*yLast;
int idx = 0;
float tvLast = 0;
for (int j = 1; j <= PartCount; j++)
{
float tv = (float)j / PartCount;
float y = 10 * (tv - CrossY) / CrossDistY;
float y2 = y*y;
float xLast = 10 * -CrossX / CrossDistX;
float xLast2 = xLast*xLast;
float tuLast = 0;
for (int i = 1; i <= PartCount; i++)
{
float tu = (float)i / PartCount;
float x = 10 * (tu - CrossX) / CrossDistX;
float x2 = x*x;
float mul1 = sqrtf(xLast2 + yLast2 + focus2)/50;
float mul2 = sqrtf(x2 + yLast2 + focus2)/50;
float mul3 = sqrtf(xLast2 + y2 + focus2)/50;
float mul4 = sqrtf(x2 + y2 + focus2)/50;
CUSTOMVERTEX *p = &dataPtr[idx++];
p->position.x = xLast / mul1;
p->position.y = -yLast / mul1;
p->position.z = Focus / mul1;
p->tu = tuLast;
p->tv = tvLast;
p = &dataPtr[idx++];
p->position.x = x / mul2;
p->position.y = -yLast / mul2;
p->position.z = Focus / mul2;
p->tu = tu;
p->tv = tvLast;
p = &dataPtr[idx++];
p->position.x = xLast / mul3;
p->position.y = -y / mul3;
p->position.z = Focus / mul3;
p->tu = tuLast;
p->tv = tv;
p = &dataPtr[idx++];
*p = *(p-1);
p = &dataPtr[idx++];
*p = *(p-3);
p = &dataPtr[idx++];
p->position.x = x / mul4;
p->position.y = -y / mul4;
p->position.z = Focus / mul4;
p->tu = tu;
p->tv = tv;

tuLast = tu;
xLast = x;
xLast2 = x2;
}
tvLast = tv;
yLast = y;
yLast2 = y2;
}
vbPtr->Unlock();

mD3DDevicePtr->SetStreamSource(0, vbPtr, 0, sizeof(*dataPtr));
mD3DDevicePtr->SetFVF( D3DFVF_CUSTOMVERTEX );
mD3DDevicePtr->DrawPrimitive( D3DPT_TRIANGLELIST, 0, count );
}
vbPtr->Release();
}
return S_OK;
}
Отредактировано: CodeGrinder - 20 авг 2014 12:30:10
  • +0.00 / 0
  • АУ
ОТВЕТЫ (0)
 
Комментарии не найдены!