directx-11 - 当对象在世界空间中移动时,XMVector3Project 给出偏移值
问题描述
我正在尝试将世界空间坐标转换为 2D 游戏的屏幕空间坐标,以便我可以处理与窗口边缘的碰撞。
我用来将世界空间坐标转换为屏幕空间的代码如下
float centerX = boundingBox.m_center.x;
XMVECTORF32 centerVector = { centerX, 0.0f, 0.0f, 0.0f };
Windows::Foundation::Size screenSize = m_deviceResources->GetLogicalSize();
//the matrices are passed in transposed, so reverse it
DirectX::XMMATRIX projection = XMMatrixTranspose(XMLoadFloat4x4(&m_projectionMatrix));
DirectX::XMMATRIX view = XMMatrixTranspose(XMLoadFloat4x4(&m_viewMatrix));
worldMatrix = XMMatrixTranspose(worldMatrix);
XMVECTOR centerProjection = XMVector3Project(centerVector, 0.0f, 0.0f, screenSize.Width, screenSize.Height, 0.0f, 1.0f, projection, view, worldMatrix);
float centerScreenSpace = XMVectorGetX(centerProjection);
std::stringstream ss;
ss << "CENTER SCREEN SPACE X: " << centerScreenSpace << std::endl;
OutputDebugStringA(ss.str().c_str());
我有一个窗口宽度1262
。对象位于(0.0, 0.0, 0.0)
并且该位置的当前屏幕空间 X 坐标631
是正确的。但是,当我将对象移向屏幕边缘时,就会出现问题。
当我将对象向左移动时,该位置的当前屏幕空间 X 坐标0.107788
实际上应该在它的上方0
,因为中心点仍然在屏幕上并且不靠近边缘。将对象向右移动时也会发生同样的情况。
以像素为单位的屏幕尺寸是正确的,但有些人认为屏幕过早截止,如下图所示。红色虚线似乎不是窗口的边缘。我可以通过添加一个额外的偏移来解决这个问题,但我不相信这是解决它的正确方法,我想知道我哪里出错了。
有谁知道为什么坐标不正确?
编辑
使用更新中的每个对象(黑色矩形)计算世界矩阵
XMMATRIX world = XMMatrixIdentity();
XMMATRIX scaleMatrix = XMMatrixScaling(m_scale.x, m_scale.y, m_scale.z);
XMMATRIX rotationMatrix = XMMatrixRotationY(0.0f);
XMMATRIX translationMatrix = XMMatrixTranslation(m_position.x, m_position.y, m_position.z);
world = XMMatrixTranspose(scaleMatrix * rotationMatrix * translationMatrix);
//update the object's world with new data
m_sprite->SetWorld(world);
我感觉这可能与投影矩阵有关,因为我目前正在使用透视投影进行 2d 渲染。虽然我应该使用正字法,但这肯定不是问题吗?
解决方案
推荐阅读
- api - Google Analytics API 权限不足
- html - 如何在不使用 Opacity 属性的情况下将透明背景颜色应用于分区
- apache-spark - Spark MlLib (Java) 中的分类和数值特征
- java - Android 插件 3.0.0+ 数据绑定错误?
- apache-spark - Spark 中的 Drools - 性能
- php - 计算wordpress帖子的数量并回应它
- machine-learning - 如何在python中提取随机森林的决策规则
- javascript - 读取列表中特定元素的数据
- javascript - 在 javascript 文件中为 NodeJS 添加环境变量
- node.js - `$set` 可以替换 mongoDB 中 Boolean 类型的字段值吗?