【转】D3DXMatrixPerspectiveFovLH参数fovy

1:透视投影矩阵的说明
D3DXMATRIX * D3DXMatrixPerspectiveFovLH(  D3DXMATRIX * pOut,  FLOAT fovy,  FLOAT Aspect,  FLOAT zn,  FLOAT zf);最难理解的参数:fovy
通过调用D3DXMatrixPerspectiveFovLH得到的矩阵为
xScale     0          0               0
0        yScale       0               0
0          0       zf/(zf-zn)         1
0          0       -zn*zf/(zf-zn)     0
where:
yScale = cot(fovY/2)

xScale = yScale / aspect ratio
该矩阵的推导过程我们不必关心,否则要d3dx干嘛?
经过推导,假设空间中一点P( x, y,z,1).那么经过投影变换后新的坐标为
P`(  x*xScale,  y*yScale,  z*zf/(zf-zn) – zn*zf(zf-zn), z ), 这时得到的坐标是齐次空间坐标,应映射到三维空间坐标。 同时除以z
我们还要找到角度和点位置某种形象的关系,现在看来z和角度fovy无关
一般我们会把fov设定在0-PI/2之间也就是0-90度。Fovy/2处于0-45度 也就是说 x和y是随着fovy变大而减小的。如果愿意的话可以画一张图。。。
那我们就知道了这样一个事实――》假设一个立方体 如果我们设定fovy为PI/6时看到的大小为cube1,那么fovy设定为PI/3时的大小cube2  应有 cube1 > cube2
 
本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/allenhiman/archive/2009/02/21/3918323.aspx

转载于:https://www.cnblogs.com/black/p/5171951.html

在D3D11绘图基础中[^1],构建一个旋的彩色立方体通常涉及以下步骤: 1. **设置设备**: ```cpp ID3D11DeviceContext* deviceContext; CreateDeviceAndContextCreationFlags(pDX, D3D11_SDK_VERSION, &device, &deviceContext); ``` 2. **创建顶点缓冲区(Vertex Buffer)**: 编写一个描述立方体顶点的数据结构,如`float3 vertices[] = {...}`,并将其换成ID3D11Buffer。 3. **创建索引缓冲区(Index Buffer)**: 对于立方体,通常会使用12条边的索引,构成一个三角形网格。 4. **设置视口和投影矩阵**: ```cpp D3DXMatrixPerspectiveFovLH(&projection, D3DXToRadian(45.0f), (float)width / height, 0.1f, 100.0f); deviceContext->RSSetViewports(1, &viewport); ``` 5. **绘制几何**: ```cpp IASetVertexBuffers(deviceContext, 0, 1, &verticesBuffer, strides, offsets); IASetIndexBuffer(deviceContext, indexBuffer, DXGI_FORMAT_R32_UINT, 0); deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); deviceContext->DrawIndexed(numVertices, numIndices, 0); ``` 6. **变换与着色**: 使用统一的变换矩阵(包括位置、旋和缩放),应用到顶点上,并通过着色器进行渲染。 7. **更新变换**: 每次循环时,根据用户输入或动画逻辑更新变换矩阵。 8. **提交命令缓冲区**: ```cpp ID3DBuffer* commandList[1]; deviceContext->CopyResource(commandList[0], commandQueue->GetCommandList()); commandQueue->ExecuteCommandLists(1, commandList); ``` 这些步骤展示了基本的D3D11绘图过程,但实际操作可能需要更详细的代码实现和错误处理。如果你想要深入了解D3D11-On-12映射层[^2]的高级特性,那里的代码示例可以作为进一步学习的起点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值