- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个函数,使用 Irrlicht 引擎在空间中定位自由 float 的 2D 光栅图像。其灵感来自函数 rgl::show2d在 R 包 rgl 中。可以找到 R 中的示例实现 here .
输入数据应限于图像的路径和包含相应绘图矩形的四个角坐标的表格。
我用 irrlicht 实现这一点的第一个非常原始但最终失败的方法:
创建一个立方体:
ISceneNode * picturenode = scenemgr->addCubeSceneNode();
压平一侧:
picturenode->setScale(vector3df(1, 0.001, 1));
添加图像作为纹理:
picturenode->setMaterialTexture(0, driver->getTexture("path/to/image.png"));
将展平的立方体放置在四个角坐标的中心位置。我只是用一个小函数 position_calc()
计算所有三个轴上的平均坐标。
vector3df position = position_calc(rcdf); picturenode->setPosition(position);
通过计算由四个角坐标定义的平面的法线、归一化结果并尝试以某种方式将生成的 vector 转换为旋转角度来确定对象旋转。
vector3df normal = normal_calc(rcdf);
vector3df angles = (normal.normalize()).getSphericalCoordinateAngles();
picturenode->setRotation(angles);
此解决方案未产生预期结果。旋转计算错误。使用这种方法,我也无法将图像正确缩放到它的角坐标。
如何修复我的工作流程?还是有我不知道的更好的方法来使用 Irrlicht 实现此目的?
编辑:感谢@spug,我相信我快到了。我尝试实现他的方法 2,因为 quaternions已经在 Irrlicht 中可用。这是我计算旋转的方法:
#include <Rcpp.h>
#include <irrlicht.h>
#include <math.h>
using namespace Rcpp;
core::vector3df rotation_calc(DataFrame rcdf) {
NumericVector x = rcdf["x"];
NumericVector y = rcdf["y"];
NumericVector z = rcdf["z"];
// Z-axis
core::vector3df zaxis(0, 0, 1);
// resulting image's normal
core::vector3df normal = normal_calc(rcdf);
// calculate the rotation from the original image's normal (i.e. the Z-axis)
// to the resulting image's normal => quaternion P.
core::quaternion p;
p.rotationFromTo(zaxis, normal);
// take the midpoint of AB from the diagram in method 1, and rotate it with
// the quaternion P => vector U.
core::vector3df MAB(0, 0.5, 0);
core::quaternion m(MAB.X, MAB.Y, MAB.Z, 0);
core::quaternion rot = p * m * p.makeInverse();
core::vector3df u(rot.X, rot.Y, rot.Z);
// calculate the rotation from U to the midpoint of DE => quaternion Q
core::vector3df MDE(
(x(0) + x(1)) / 2,
(y(0) + y(1)) / 2,
(z(0) + z(1)) / 2
);
core::quaternion q;
q.rotationFromTo(u, MDE);
// multiply in the order Q * P, and convert to Euler angles
core::quaternion f = q * p;
core::vector3df euler;
f.toEuler(euler);
// to degrees
core::vector3df degrees(
euler.X * (180.0 / M_PI),
euler.Y * (180.0 / M_PI),
euler.Z * (180.0 / M_PI)
);
Rcout << "degrees: " << degrees.X << ", " << degrees.Y << ", " << degrees.Z << std::endl;
return degrees;
}
结果几乎正确,但在一个轴上的旋转是错误的。有没有办法解决这个问题,或者我的实现是否存在固有缺陷?
这就是现在的结果。这些点标记了预期的角点。
最佳答案
我想到了两种方法来做到这一点;两者都不是很优雅 - Irrlicht 将我们限制在球形极点上并没有帮助。
注意。下面假设 rcdf
以原点为中心;这是为了让旋转计算更直接一些。虽然很容易修复:
rcdf
的中心点(平移偏移量)rcdf
的所有点中减去这个先决条件:缩放
这很简单;只需计算 rcdf
中的宽度和高度与原始图像的比率,然后调用 setScaling
。
方法一:矩阵求逆
为此,我们需要一个支持 3x3 矩阵的外部库,因为 Irrlicht 只有 4x4(我相信)。
我们需要求解将图像从 X-Y 旋转到 rcdf
的矩阵方程。为此,我们在每个引用系中需要 3 个点。我们可以立即将其中两个设置为图像的相邻角;第三个必须指向图像平面之外(因为我们需要所有三个维度的数据来形成一个完整的基础)——所以要计算它,只需将每个图像的法线乘以某个偏移常数(比如 1)即可。
(注意原始图像上的点已经缩放)
因此,要求解的方程是:
(使用列符号)。 Eigen
库提供了 3x3 矩阵和逆矩阵的实现。
然后将此矩阵转换为球形极角:https://www.learnopencv.com/rotation-matrix-to-euler-angles/
方法二:
要计算从方向 vector A 到 B 旋转的四元数:Finding quaternion representing the rotation from one vector to another
计算从原始图像的法线(即 Z 轴)到 rcdf
的法线 => 四元数 P
.
从方法1的图中取AB的中点,用四元数P
旋转它(http://www.geeks3d.com/20141201/how-to-rotate-a-vertex-by-a-quaternion-in-glsl/ ) => vector U
。
计算从U
到DE中点的旋转=>四元数Q
按顺序Q * P
相乘,转换为欧拉角:https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
(不确定 Irrlicht 是否支持四元数)
关于c++ - Irrlicht:根据四个角坐标在3D空间绘制2D图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45052226/
运行 Tomcat 失败并出现 java.lang.OutOfMemoryError - 与缺少 PermGen 空间相关的错误。 我最近将 Tomcat 更改为以自己的用户(而非 root)运行。
我们有一个表,其中包含数百万行,其中包含 PostGIS 几何图形。我们要执行的查询是:落在边界几何内的最新条目是什么?这个查询的问题是我们经常会有大量的项目匹配边界框(半径大约为 5 公里),然后
我有一个Elasticsearch设置,它将允许用户搜索通配符作为索引。 array:3 [ "index" => "users" "type" => "user" "body" => arra
我创建了一个表,其中每行包含两个按钮,并且两个按钮连接在一起,我想将两个按钮分开。我用过 不起作用,css 也是,这是他们的另一种方式。 我有另一个问题,因为我不想在表格边框内显示操作按钮,而是在靠近
我试图在 jQuery Mobile 中的两个按钮之间留出空白。现实中的布局是这样的: Button 1 Button 2 (Hidden w/ display: none)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
您好,我对图表应用程序还很陌生。现在我为我的应用程序创建了条形图。当我运行 create bar chart as separate project 时,输出如下所示。 然后当我将条形图与我的应用程序
我在使用 H2 和 GeoDB(内存中,junit)时遇到问题。 另外,使用 Hibernate 5(每个包的最新版本,包括 hibernate-spatial)和 Spring 4。 通过 id 实
我想画一张澳大利亚的 map ,并将每个城市表示为一个点。 然后突出显示人口众多(> 1M)的城市 library(sp) library(maps) data(canada.cities) head
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 6年前关闭。 Improve this
如何保持.txt文件中存在的空格?在.txt文件中,它表示: text :text text1 :text1 text23 :text2 text345 :text3 如果我写这段
以下哪个键最大? 选项 1:16 个数字 [0,9] 选项 2:30 个元音 选项 3:字母表中的 16 个字母 选项 4:32 位 有人可以帮助我,告诉我哪一个是正确的答案以及我们如何计算它吗?我知
在 Unity 3d 中使用 Azure 空间 anchor 来实现在 iOS 和 Android 上部署的室内和室外增强现实体验是否有益? 最佳答案 是的,对于 Azure Spatial Anch
我有一个绝对定位的圆形图像。图像只需占据屏幕宽度的 17%,并且距离顶部 5 个像素。 问题是,当我调整图像大小以占据屏幕宽度的 17% 时,它会这样做,但同时容器会变长。图像本身不会拉伸(stret
我在 Ubuntu 14.04 上使用 Cassandra。从文档中,我可以看到运行命令: nodetool snapshot 创建我的 key 空间的快照。 命令的输出是: nodetool sn
Heroku引入了“私有(private)空间”,是否可以将现有应用迁移到私有(private)空间? https://blog.heroku.com/archives/2015/9/10/herok
是否允许在语义记录中使用非绑定(bind)空格 或其他 HTML 编码字符?我遇到的问题是 ; 字符被软件视为记录的结尾。 例如:假设我有一份婚姻记录,其中包含 2 个结婚者的姓氏、结婚年份以及结
我正在研究“智能 parking ”项目,偶然发现了包含我们真正需要的YouTube视频。我们已经实现了第一部分,即从视频源进行实时透视变换,下一步是将其定义为一组矩形 我基本上需要知道他是如何做到的
我有两个类:Engine 和 Trainset(多个单元),这两个类共享其 ID 空间,其中包含名称和系列 id=- . 这是我的Engine类(它是抽象的,因为有引擎的子类型(DieselEngin
如果有人能帮助我,那就太好了。 我正在尝试使用Java的Split命令,使用空格分割字符串,但问题是,字符串可能没有空格,这意味着它将只是一个简单的顺序(而不是“输入2”将是“退出”) Scanner
我是一名优秀的程序员,十分优秀!