社区
游戏开发
帖子详情
D3D 纹理大小,以及屏幕大小
cytlyy
2009-07-21 11:27:50
我想问下,如果我做了一个立方体。比如它的一个正面纹理坐标是:
(-1,1) (1,-1)
(-1,-1) (-1,-1)
屏幕的分辨率是640×480的。
我想问下,如何设置D3DVECTOR3 的视角坐标,以及D3DMatrixPerspectiveFovLH来控制我这个纹理显示的时候正好是整个屏幕的大小?或者是否有什么计算公式来控制纹理的显示的实际大小和屏幕的关系?谢谢!
...全文
569
19
打赏
收藏
D3D 纹理大小,以及屏幕大小
我想问下,如果我做了一个立方体。比如它的一个正面纹理坐标是: (-1,1) (1,-1) (-1,-1) (-1,-1) 屏幕的分辨率是640×480的。 我想问下,如何设置D3DVECTOR3 的视角坐标,以及D3DMatrixPerspectiveFovLH来控制我这个纹理显示的时候正好是整个屏幕的大小?或者是否有什么计算公式来控制纹理的显示的实际大小和屏幕的关系?谢谢!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xingzhe2001
2009-07-22
打赏
举报
回复
是覆盖整个viewport。
xingzhe2001
2009-07-21
打赏
举报
回复
[Quote=引用楼主 cytlyy 的帖子:]
或者是否有什么计算公式来控制纹理的显示的实际大小和屏幕的关系?谢谢!
[/Quote]
可以参考这个帖子
请问一个3D变换的问题
,有详细的介绍。
xingzhe2001
2009-07-21
打赏
举报
回复
可以用xyzhw,参考
在D3D下,把纹理贴到对应大小的窗体上,为什么纹理比对应的BMP文件看起来更模糊?
,后面有源代码。
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个面的大小显示到屏幕上时正好是全屏的效果。如下图所示:
D
3d
YUV 三层
纹理
显示
d
3d
9 显示YUV 通过3个texture显示(C++),YUV的显示使用了像素着色器来生成RGBA的数据
D
3D
基本图元的绘制
D
3D
基本图元的绘制,演示使用不同的方式绘制基本的图元
论坛求助~如何用D
3D
的精灵接口显示图片
不能正确显示, 但是数据应该是正确读取的, 求助~
D
3D
代码Demo大全
包括各种各样的效果实例,如光照与材质,雾化与体积雾, 高级
纹理
应用,HLSL顶点渲染,自然现象模拟,运动模糊效果,网格模型高级技术,粒子系统,广告板技术,三维场景交互等等30多种效果大全
和之前那个maya的exporter配套的D
3D
显示的程序
论坛求助的, 有兴趣的可以下去看看, 用D
3D
显示一个mesh物体
游戏开发
8,325
社区成员
23,684
社区内容
发帖
与我相关
我的任务
游戏开发
游戏开发相关内容讨论专区
复制链接
扫一扫
分享
社区描述
游戏开发相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章