• 9
• 9
• 11
• 12
• 9

# Translation problems

This topic is 3952 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I've been working on a skybox, and I want it to follow my camera (positon only, no rotations). easy you say, but even when I pass in the camera's eyepos, it barely moves. any ideas where the bug could be? heres the rendering code for the skybox to get you started
void cSky::Render(LPDIRECT3DDEVICE9 pDxDevHandle, D3DXVECTOR3 Translation)
{
Pos=Translation;
D3DXMATRIX m_Translation;
D3DXMatrixIdentity(&m_Translation);

pDxDevHandle->SetStreamSource(0, p_SkyBox_VB, 0, sizeof(TEXTURED_VERTEX3D));
pDxDevHandle->SetFVF(CUSTOM_FVF_TEXTURED);
pDxDevHandle->SetIndices(p_SkyBox_IB);
pDxDevHandle->SetTexture(0,Tex.Use());

D3DXMatrixTranslation(&m_Translation,Pos.x,Pos.y,Pos.z);

pDxDevHandle->SetTransform(D3DTS_WORLD, &m_Translation);
pDxDevHandle->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,36);//its a cube!
}



##### Share on other sites
You know, I was hoping this was about languages so I could make a joke about translation and rotation. I guess I'll just have to settle for giving a real answer :(

Well, I'm not sure how you do your camera, but simple code often looks like this:
// pseudocodecamera_view:  load_identity  rotate_z(-camera.rz)  rotate_y(-camera.ry)  rotate_x(-camera.rx)  translate(-camera.x-camera.y,-camera.z)render:  camera_view  translate(object.x,object.y,object.z)  rotate_x(object.rx)  rotate_y(object.ry)  rotate_z(object.rz)  draw(object)

In this case, the skybox's position would be camera.x, camera.y, camera.z, and all rotations are 0. The net effect is that the box is untranslated, but rotated.

##### Share on other sites
Thanks for trying dude, but I'm defiately getting wierd behaviour. even if I put my own translation vector, like D3DXVECTOR3 (128,128,128); my box is drawn near the origin. It's like i've got some hidden scaling, but I've not used any scaling anywhere.

##### Share on other sites
D3DXMatrixIdentity(&m_Translation);

Well, it looks like what you're doing is starting with the identity matrix instead of the current matrix, and I'm not sure what you're doing if anything to preserve the current matrix for after you render the skybox.

##### Share on other sites
Tried that now, but I'm still getting a tiny translation instead of a full-scale one. I have a Height mapped terrain, which renders in the expected place, it only seems to be my skybox that does. very strange.

Now that I've done that though, I can begin to see the camera's rotation affecting the skybox.

any way I can get the camera's position in world space? that would surely be where I'd want to put the skybox.

##### Share on other sites
I suppose I'm not sure how you set up your view matrix; many people specify the location of the camera, and then set their view matrix based on that. What do you do?

##### Share on other sites
Would it not be easier to set the camera's position, and thus the view matrix, back to the origin for skybox rendering, rather than translating the skybox with the camera? When rendering the skybox, zero out the view matrix' translation elements, so that the camera is at the skybox' centre. This can be done using the LookAt function and specifying that the camera's position at 0,0,0. You can then reset the view matrix to the normal way for rendering other non-skybox objects. I think that thats the more conventional way of rendering skyboxes.

Anyways, I agree with erissian. Your function seems to be fine, so there is probuary a problem with the way you're managing your view matrix. I think posting some more of the code (specifically the part that calls the skybox render function) may help in solving this one.

##### Share on other sites
ok, guys, thanks for the help.

the code is created for modularity, so its a bit fragmented

This is the main loop, called from a D3DX9App class. Tidy

void cGame::MainLoop(float FTime){	CheckForDebugEntry();					//keyboard handler to breakpoint		CheckForQuitMsg();						//keyboard handler for quit	Cam.Update(m_pDxDev, FTime);			//update camera	Skybox.Render(m_pDxDev,Cam.GetEyePos());//render skybox	HeightMap.Render(m_pDxDev);				//render heightmap		}

this is the camera's basic workings, they consist of a view matrix updater, and some control routines.

void cCamera::UpdateViewMatrix(LPDIRECT3DDEVICE9 p_dx_Device){	D3DXMatrixIdentity( &m_mView );	D3DXVec3Normalize( &m_vTargetPos, &m_vTargetPos );	D3DXVec3Cross( &m_vRight, &m_vUpVector, &m_vTargetPos );	D3DXVec3Normalize( &m_vRight, &m_vRight );	D3DXVec3Cross( &m_vUpVector, &m_vTargetPos, &m_vRight );	D3DXVec3Normalize( &m_vUpVector, &m_vUpVector );	m_mView._11 = m_vRight.x;	m_mView._12 = m_vUpVector.x;	m_mView._13 = m_vTargetPos.x;	m_mView._14 = 0.0f;	m_mView._21 = m_vRight.y;	m_mView._22 = m_vUpVector.y;	m_mView._23 = m_vTargetPos.y;	m_mView._24 = 0.0f;	m_mView._31 = m_vRight.z;	m_mView._32 = m_vUpVector.z;	m_mView._33 = m_vTargetPos.z;	m_mView._34 = 0.0f;	m_mView._41 = D3DXVec3Dot( &m_vEyePos, &m_vRight );	m_mView._42 = D3DXVec3Dot( &m_vEyePos, &m_vUpVector );	m_mView._43 = D3DXVec3Dot( &m_vEyePos, &m_vTargetPos );	m_mView._44 =  1.0f;	p_dx_Device->SetTransform( D3DTS_VIEW, &m_mView ); 	m_vUpVector=D3DXVECTOR3(0,1,0);}void cCamera::Update(LPDIRECT3DDEVICE9 p_dx_Device, float fTime){	// Move the camera's view by the mouse	SetViewByMouse();	// This checks to see if the keyboard was pressed	CheckForMovement(fTime);	// Does what it says - Updates the View Matrix	UpdateViewMatrix(p_dx_Device);}

and the accessor seen in the main loop

//basic accessors	D3DXVECTOR3 GetEyePos()								{return m_vEyePos;}

##### Share on other sites
found a tutorial @ http://www.toymaker.info/Games/html/skybox.html

basically told me something similar to MattWhite06
Quote:
 When rendering the skybox, zero out the view matrix' translation elements, so that the camera is at the skybox' centre.

so, thanks :)

##### Share on other sites
Quote:
 found a tutorial @ http://www.toymaker.info/Games/html/skybox.htmlbasically told me something similar to MattWhite06

Cool, glad it helped. However, if you translate the skybox with the camera like you did, it should still work even though it isn't the conventional way. So, am going to have a crack at finding the bug anyways! [smile]

Quote:
 m_mView._41 = D3DXVec3Dot( &m_vEyePos, &m_vRight );m_mView._42 = D3DXVec3Dot( &m_vEyePos, &m_vUpVector );m_mView._43 = D3DXVec3Dot( &m_vEyePos, &m_vTargetPos );

I may be wrong, but shouldn't this bit be simply your camera's position, but negative? Dot Producting will give you answers between -1 and 1, and may explain why your only getting slight movement of your skybox. Maybe this is the correct way instead?

  m_mView._41 = -m_vEyePos.x;  m_mView._42 = -m_vEyePos.y;  m_mView._43 = -m_vEyePos.z;