qt - 在 Qml qt3d 中将 2d 坐标转换为 3d 坐标
问题描述
我有一个窗口大小宽度:1500 高度:780,我想用 2d 坐标渲染 3d 对象,将 z=1 作为虚拟值。以下是 qml 代码。(如果我必须在 x=0,y=0 处渲染,3d 对象应该渲染的位置应该与 qml 中的 Rectangle 渲染的位置完全相同,即窗口坐标)
Entity {
id: root
property real x: 2.0
property real y: 0.0
property real z: 0.0
property real scale: 1
property var mainCam
property var forwardRenderer
property Material material
components: [ trefoilMeshTransform, mesh, root.material ]
Transform {
id: trefoilMeshTransform
property real userAngle: 900.0
translation:Qt.vector3d(0,1,1)
property real theta: 0.0
property real phi:0.0
property real roll: 0.0
rotation: fromEulerAngles(theta, phi, roll)
scale: root.scale
}
Mesh {
id: mesh
source: "assets/obj/cube.obj"
}
}
该代码与线框示例完全相同,包括相机设置。我尝试在 qml 中使用 qt3d unproject api,但没有成功。你能帮我提供线索吗?
解决方案
请阅读有关如何将世界转换为屏幕坐标的文档,反之亦然,这有助于理解一些逻辑。还有这个。
在 qt3d 中,我通过使用RayCaster和ScreenRayCaster获得 3d 坐标, 它为您提供本地位置和世界位置以及屏幕 x ,您可以 从kdab及其示例中查看此站点
RenderSettings{
//all components that you need like viewport , InputSettings ,...
ScreenRayCaster {
id: screenRayCaster
onHitsChanged: printHits("Screen hits", hits)
}
}
MouseHandler {
id: mouseHandler
sourceDevice: MouseDevice {}
onReleased: { screenRayCaster.trigger(Qt.point(mouse.x, mouse.y)) }
}
function printHits(desc, hits) {
console.log(desc, hits.length)
for (var i=0; i<hits.length; i++) {
console.log(" " + hits[i].entity.objectName, hits[i].distance,
hits[i].worldIntersection.x, hits[i].worldIntersection.y, hits[i].worldIntersection.z)
}
}
推荐阅读
- python - Python Flask Rest Plus - 返回响应对象以及描述
- python - python - 输出问题 - 遍历字典
- spring - Provider的Spring注入
是缓慢的 - javascript - 即使应用程序在后台关闭/运行,离子也能监控某些功能
- reactjs - 在 Jest/React 中的“Connect(App)”的上下文或道具中找不到“store”
- android - Android权限checkSelfPermission不起作用
- haskell - 我如何“说服” GHC 我已经排除了某个案例?
- java - 如何在 Spring Boot 执行器中实现自定义端点以健康
- javascript - 如何用 JS 添加类样式?
- python - 将 PythonScriptStep 内部的指标记录到父 PipelineRun