D3D 纹理大小,以及屏幕大小

cytlyy 2009-07-21 11:27:50
我想问下,如果我做了一个立方体。比如它的一个正面纹理坐标是:
(-1,1) (1,-1)



(-1,-1) (-1,-1)
屏幕的分辨率是640×480的。
我想问下,如何设置D3DVECTOR3 的视角坐标,以及D3DMatrixPerspectiveFovLH来控制我这个纹理显示的时候正好是整个屏幕的大小?或者是否有什么计算公式来控制纹理的显示的实际大小和屏幕的关系?谢谢!
...全文
569 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingzhe2001 2009-07-22
  • 打赏
  • 举报
回复
是覆盖整个viewport。
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 cytlyy 的帖子:]
或者是否有什么计算公式来控制纹理的显示的实际大小和屏幕的关系?谢谢!
[/Quote]
可以参考这个帖子 请问一个3D变换的问题 ,有详细的介绍。
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xingzhe2001 的回复:]
计算方式就是 tan(fov/2) = (正方形面的宽*0.5) / (正方形面的位置-摄像机位置)
你这里宽为2,正方形面的位置为-1,所以有
tan(fov/2) = 1/(-1-camPos)。
你原来的情况
tan(fov/2) = 1/(-1-(-5)) = 1/4 = 0.25
arctan(0.25) = PAI/12.8 所以你试的fov=PAI/6.4
[/Quote]
试了下这个公式,比较准确。
我想问下,这种方法计算出来的结果是覆盖整个窗体还是整个屏幕?如果我创建的显示3D的窗体不是全屏的,这样计算后的运算效果是不是覆盖了整个窗体而不是整个屏幕?谢谢了!
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
fov是视线左右的夹角,因为你的正方形的面充满了屏幕,所以有上面的公式。
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
计算方式就是 tan(fov/2) = (正方形面的宽*0.5) / (正方形面的位置-摄像机位置)
你这里宽为2,正方形面的位置为-1,所以有
tan(fov/2) = 1/(-1-camPos)。
你原来的情况
tan(fov/2) = 1/(-1-(-5)) = 1/4 = 0.25
arctan(0.25) = PAI/12.8 所以你试的fov=PAI/6.4
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
你需要做的就是把fov改为90度,把摄像机位置拉到-2
D3DMXMatrixPerspectiveFovLH( &matProj, D3DMX_PI/2.0f, 1.0f, 1.0f, 10.0f );
D3DMXVECTOR3 vEyePt( 0.0f, 0.0f,-2.0f );
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xingzhe2001 的回复:]
你不要自己先试一下么?
[/Quote]
我只是做些mobile下的简单的3D应用。所以对3D了解的也不过深,希望能指教!谢谢!
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xingzhe2001 的回复:]
你不要自己先试一下么?
[/Quote]
希望能告诉我一种比较简单的方法,最好举个例子。这样以后也就会了。麻烦了!谢谢!
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
你不要自己先试一下么?
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
屏幕分辨率是640*480,3D是要全屏效果。
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xingzhe2001 的回复:]
假设窗口或者viewport为w*h,让你的立方体为w*w*h,设置fov=pi/2,摄像机距离方盒子距离为h/2应该可以。

你实际上是想让盒子正好跟视锥体的前部一样大,那你搜一下视坐标下视锥体的计算方法。根据fov的定义就可以。如果你用D3DXMatrixPerspectiveLH
根据w,h,n,f来计算投影矩阵,则更好确定视锥体的大小。如果是这种方法,视锥体左边是-w/2,右边是w/2,上边是h/2,下边是-h/2,前边是n,后边是f.
[/Quote]
我就是想让盒子正好和椎体前部一样大。
你看下这段代码是纹理的坐标以及用来投影和旋转正方体的。
struct CUSTOMVERTEX
{
FLOAT x, y, z; // The transformed position for the vertex
DWORD color; // The vertex color
FLOAT tu,tv; //texture point
};
CUSTOMVERTEX vertices[] =
{
{-1.0f, -1.0f, -1.0f, 0xff000000, 0.0f, 0.5f}, //0
{1.0f, -1.0f, -1.0f, 0xff000000, 1.0f/3,0.5f}, //1
{-1.0f, 1.0f, -1.0f, 0xff000000, 0.0f, 0.0f}, //3

{1.0f, -1.0f, -1.0f, 0xff000000, 1.0f/3,0.5f}, //1
{-1.0f, 1.0f, -1.0f, 0xff000000, 0.0f, 0.0f}, //3
{1.0f, 1.0f, -1.0f, 0xff000000, 1.0f/3, 0.0f}, //2


{-1.0f, 1.0f, -1.0f, 0xff000000, 0.0f, 1.0f}, //3
{1.0f, 1.0f, -1.0f, 0xff000000, 1.0f/3, 1.0f}, //2
{-1.0f, 1.0f, 1.0f, 0xff000000, 0.0f, 0.5f}, //4

{1.0f, 1.0f, -1.0f, 0xff000000, 1.0f/3, 1.0f}, //2
{-1.0f, 1.0f, 1.0f, 0xff000000, 0.0f, 0.5f}, //4
{1.0f, 1.0f, 1.0f, 0xff000000, 1.0f/3, 0.5f}, //5


{-1.0f, 1.0f, 1.0f, 0xff000000, 1.0f/3, 0.5f}, //4
{1.0f, 1.0f, 1.0f, 0xff000000, 2.0f/3, 0.5f}, //5
{-1.0f, -1.0f, 1.0f, 0xff000000, 1.0f/3, 0.0f}, //7

{1.0f, 1.0f, 1.0f, 0xff000000, 2.0f/3, 0.5f}, //5
{-1.0f, -1.0f, 1.0f, 0xff000000, 1.0f/3, 0.0f}, //7
{1.0f, -1.0f, 1.0f, 0xff000000, 2.0f/3, 0.0f}, //6


{-1.0f, -1.0f, 1.0f, 0xff000000, 1.0f/3, 0.5f}, //7
{1.0f, -1.0f, 1.0f, 0xff000000, 2.0f/3, 1.0f}, //6
{-1.0f, -1.0f, -1.0f, 0xff000000, 1.0f/3, 0.5f}, //0

{-1.0f, -1.0f, -1.0f, 0xff000000, 1.0f/3, 0.5f}, //0
{1.0f, -1.0f, -1.0f, 0xff000000, 2.0f/3,0.5f}, //1
{1.0f, -1.0f, 1.0f, 0xff000000, 2.0f/3, 1.0f}, //6


{1.0f, -1.0f, -1.0f, 0xff000000, 2.0f/3,0.5f}, //1
{1.0f, 1.0f, -1.0f, 0xff000000, 2.0f/3, 0.0f}, //2
{1.0f, -1.0f, 1.0f, 0xff000000, 1.0f, 0.5f}, //6

{1.0f, 1.0f, -1.0f, 0xff000000, 2.0f/3, 0.0f}, //2
{1.0f, -1.0f, 1.0f, 0xff000000, 1.0f, 0.5f}, //6
{1.0f, 1.0f, 1.0f, 0xff000000, 1.0f, 0.0f}, //5


{-1.0f, -1.0f, 1.0f, 0xff000000, 2.0f/3, 1.0f}, //7
{-1.0f, 1.0f, 1.0f, 0xff000000, 2.0f/3, 0.5f}, //4
{-1.0f, -1.0f, -1.0f, 0xff000000, 1.0f, 1.0f}, //0

{-1.0f, 1.0f, 1.0f, 0xff000000, 2.0f/3, 0.5f}, //4
{-1.0f, -1.0f, -1.0f, 0xff000000, 1.0f, 1.0f}, //0
{-1.0f, 1.0f, -1.0f, 0xff000000, 1.0f, 0.5f}, //3
};
VOID SetupMatrices()
{
D3DMXMATRIX matWorld,matTemp;
D3DMXMatrixIdentity( &matWorld );
D3DMXMatrixRotationY(&matTemp,D3DMX_PI*angles/180.0f);//angles是绕着Y轴转动的角度
D3DMXMatrixMultiply(&matWorld,&matWorld,&matTemp);
angles-=1.0f;
g_pd3dmDevice->SetTransform( D3DMTS_WORLD, (D3DMMATRIX*)&matWorld, D3DMFMT_D3DMVALUE_FLOAT );

D3DMXVECTOR3 vEyePt( 0.0f, 0.0f,-5.0f );
D3DMXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DMXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DMXMATRIX matView;
D3DMXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dmDevice->SetTransform( D3DMTS_VIEW, (D3DMMATRIX*)&matView, D3DMFMT_D3DMVALUE_FLOAT );
D3DMXMATRIX matProj;
D3DMXMatrixPerspectiveFovLH( &matProj, D3DMX_PI/6.4f, 1.0f, 1.0f, 10.0f );
g_pd3dmDevice->SetTransform( D3DMTS_PROJECTION, (D3DMMATRIX*)&matProj, D3DMFMT_D3DMVALUE_FLOAT );
}
//麻烦你看下修改哪些变量可以控制实际显示是正好是屏幕的大小?我这是windows mobile 平台上的Dircect 3D Mobile。可能和PC上的函数有些出入。谢谢!
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xingzhe2001 的回复:]
根据w,h,n,f来计算投影矩阵,则更好确定视锥体的大小。如果是这种方法,视锥体左边是-w/2,右边是w/2,上边是h/2,下边是-h/2,前边是n,后边是f.
[/Quote]
我说得是在摄像机坐标下
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
假设窗口或者viewport为w*h,让你的立方体为w*w*h,设置fov=pi/2,摄像机距离方盒子距离为h/2应该可以。

你实际上是想让盒子正好跟视锥体的前部一样大,那你搜一下视坐标下视锥体的计算方法。根据fov的定义就可以。如果你用D3DXMatrixPerspectiveLH
根据w,h,n,f来计算投影矩阵,则更好确定视锥体的大小。如果是这种方法,视锥体左边是-w/2,右边是w/2,上边是h/2,下边是-h/2,前边是n,后边是f.
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
效果差不多,我也实现了。
只不过我想知道下如何精确的设计出最终的立方体的这几个面的大小显示出来正好是屏幕的大小。也就是我怎么精确的控制它最终显示的大小。
因为:
我可以通过调整
D3DMXMatrixPerspectiveFovLH( &matProj, D3DMX_PI/6.4f, 1.0f, 1.0f, 10.0f );
//中的D3DMX_PI/6.4f这个值的大小让它正好全屏。但是这是我是我试了几次后试出来的值。如何能直接计算出来呢?
谢谢!
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
你想做这个效果是么http://blog.csdn.net/pknife/archive/2009/07/20/4363059.aspx,类似vista 3d桌面?
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xingzhe2001 的回复:]
看不了你的图
[/Quote]
。。。图很简单,就是简单的一个正方体旋转。只需要往正方体的前后左右四个面上贴纹理即可。就是想让这四个面的大小最终显示时正好是屏幕的大小比如(640×480),不会有空隙,也不会大于屏幕尺寸.
xingzhe2001 2009-07-21
  • 打赏
  • 举报
回复
看不了你的图
cytlyy 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xingzhe2001 的回复:]
可以用xyzhw,参考在D3D下,把纹理贴到对应大小的窗体上,为什么纹理比对应的BMP文件看起来更模糊? ,后面有源代码。
[/Quote]
肯呢个你没明白我的意思。我不是纹理贴图的问题。而是比如一个正方体旋转,如何让这个正方体的4个面的大小显示到屏幕上时正好是全屏的效果。如下图所示:

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧