Skip to main content
GameDev.net gamedev.net
🔒 Locked

Zoom In Problem

Started by tanki Oct 20, 2005 at 2:43 AM 0 replies 300+ views
Original Post
tanki
tanki
I have a problem of zooming on Direct3D Graph. I use Mouse Wheel to zoom In/Out. If I change the position of mouse wheel, SetMouseWheelDelta() is called. In SetMouseWheelDelta(), the position of Eye vector is modified. Then render() is called and render() calls updateViewMatrix(); In updateViewMatrix(), View Matrix is changed. But If I keep zooming in, suddenly a line graph looks like it lost its correct position. Mesh looks like normal( I think no problem). Only Line looks strange. I'm sorry I can't upload captured images. If you see images, it's easy to understand what I'm saying. (Actually I'm not good at English -,-;;) If you can find out what problem is in my code(below), please let me know. Thank you very much. //below is part of my 3D code. void CD3DGraph::init( void ) { m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ); D3DDISPLAYMODE d3ddm; m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; d3dpp.EnableAutoDepthStencil = TRUE; //d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; D3DCAPS9 caps; m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,∩︀); int vp = 0; if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; vp |= D3DCREATE_FPU_PRESERVE; HRESULT ret = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd,vp, &d3dpp, &m_pd3dDevice ); m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE ); m_pd3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0); D3DXCreateLine(m_pd3dDevice, &m_axisX); double min_value = min(m_mapMinX, m_mapMinY); min_value = min(min_value, m_mapMinZ); double max_value = max(m_mapMaxX, m_mapMaxY); max_value = max(max_value, m_mapMaxZ); m_mapMinX = m_mapMinY = m_mapMinZ = min_value; m_mapMaxX = m_mapMaxY = m_mapMaxZ = max_value; //view port m_viewPort.Height=m_wndRect.Height(); m_viewPort.Width=m_wndRect.Width(); m_viewPort.MaxZ = (float)m_wndRect.Height();; m_viewPort.MinZ = (float)m_wndRect.Width(); m_viewPort.X = 0; m_viewPort.Y = 0; float dist = (float)min_value*4.0f; m_vEye = m_vEyeORG = D3DXVECTOR3( 0.0f,0.0f, dist); // Eye Position m_vLook = m_vLookORG =D3DXVECTOR3(0.0f, 0.0f, 1.0f); // Look Vector m_vUp = m_vUpORG =D3DXVECTOR3(0.0f, 1.0f, 0.0f); // Up Vector m_vRight= m_vRightORG =D3DXVECTOR3(1.0f, 0.0f, 0.0f); // Right Vector D3DXMATRIX matWorld; D3DXMatrixIdentity( &matWorld ); m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); D3DXMATRIX mProjection; dist = (float)min_value; D3DXMatrixPerspectiveFovLH( &mProjection, D3DXToRadian( 45.0f ), (float)m_wndRect.Width()/(float)m_wndRect.Height(), 1.0f, dist); m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &mProjection ); } //* //----------------------------------------------------------------------------- // Name: render() // Desc: Render a solar system using the D3DXMATRIX utility class //----------------------------------------------------------------------------- void CD3DGraph::render( void ) { m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0 ); m_pd3dDevice->BeginScene(); updateViewMatrix(); D3DXMATRIX out, view, proj, world; m_pd3dDevice->GetTransform(D3DTS_VIEW, &view); m_pd3dDevice->GetTransform(D3DTS_PROJECTION, &proj); m_pd3dDevice->GetTransform(D3DTS_WORLD, &world); D3DXMatrixIdentity(&out); out = world * view * proj; if(m_loadAPFlag)m_pd3dDevice->SetTexture(0,m_pApTexture); else m_pd3dDevice->SetTexture(0,NULL); m_pApMesh->DrawSubset(0);//draw mesh. m_axisX->SetWidth(1.5); for( int i = 0; i>m_currentJD) continue; m_axisX->Begin(); //draw line m_axisX->DrawTransform(&m_trj1Points, 2, &out, m_mapColors); m_axisX->End(); } m_pd3dDevice->EndScene(); m_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- // Name : updateViewMatrix() // Desc : Builds a view matrix suitable for Direct3D. // // Here's what the final matrix should look like: // // | rx ux lx 0 | // | ry uy ly 0 | // | rz uz lz 0 | // | -(r.e) -(u.e) -(l.e) 1 | // // Where r = Right vector // u = Up vector // l = Look vector // e = Eye position in world space // . = Dot-product operation // //----------------------------------------------------------------------------- void CD3DGraph::updateViewMatrix( void ) { D3DXMATRIX view; D3DXMatrixIdentity( &view ); D3DXVec3Normalize( &m_vLook, &m_vLook ); D3DXVec3Cross( &m_vRight, &m_vUp, &m_vLook ); D3DXVec3Normalize( &m_vRight, &m_vRight ); D3DXVec3Cross( &m_vUp, &m_vLook, &m_vRight ); D3DXVec3Normalize( &m_vUp, &m_vUp ); view._11 = m_vRight.x; view._12 = m_vUp.x; view._13 = m_vLook.x; view._14 = 0.0f; view._21 = m_vRight.y; view._22 = m_vUp.y; view._23 = m_vLook.y; view._24 = 0.0f; view._31 = m_vRight.z; view._32 = m_vUp.z; view._33 = m_vLook.z; view._34 = 0.0f; view._41 = -D3DXVec3Dot( &m_vEye, &m_vRight ); view._42 = -D3DXVec3Dot( &m_vEye, &m_vUp ); view._43 = -D3DXVec3Dot( &m_vEye, &m_vLook ); view._44 = 1.0f; m_pd3dDevice->SetTransform( D3DTS_VIEW, &view ); } void CD3DGraph::SetMouseWheelDelta(short delta) { float fMoveSpeed; fMoveSpeed = 10.0f; D3DXVECTOR3 tmpLook = m_vLook; m_vEye += tmpLook*fMoveSpeed*(float)delta; }
paic
paic
please, for the sake of our eyes, use [ source ] and [ / source ] (without spaces) ^^

I couldn't read your code like that, but I could suggest to use the FOV to zoom in. By defautl, the FOV should by something like PI / 4. Try to use a FOV of PI / 8 and you'll see that it zoomed in. It's not exactly the same result as moving the camera, but it has the advantage of being extremely simple to implement ^^

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.