- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些代码由用于获取标题和转换的委托(delegate)方法组成。我采用航向并将其转换为弧度并使用角度绕 y 轴旋转:
┌ ┐
Y = | cos(ry) 0 sin(ry) 0 |
| 0 1 0 0 |
| -sin(ry) 0 cos(ry) 0 |
| 0 0 0 1 |
└ ┘
What are the first two columns in SCNMatrix4
代码:
func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
print("received heading: \(String(describing: newHeading))")
self.currentHeading = newHeading
print("\(Float(currentHeading.trueHeading)) or for magneticHeading: \(currentHeading.magneticHeading)")
let headingInRadians = degreesToRadians(deg: Float(currentHeading.trueHeading))
print("\(headingInRadians) -------- headingInRadians")
var m = matrix_float4x4()
m.columns.3 = [0.0, 0.0, 0.0, 1.0]
m.columns.2 = [sin(headingInRadians), 0.0, cos(headingInRadians), 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [cos(headingInRadians), 0.0, -sin(headingInRadians), 0.0]
sceneView.session.setWorldOrigin(relativeTransform: m)
}
当我调用 setWorldOrigin
时,它正在删除所有节点。我试过暂停 session ,运行函数,然后再次启动 session ,但我遇到了这种奇怪的低帧率、低光情况。我知道这是对 setWorldOrigin
的函数调用,因为当我删除它时,我看到了节点并且它们持续存在。
更新
我一直在研究这个...我正在通过简单地尝试将比例更改为 2 来进行调试...我应该看到的是我放置在网格中的节点应该展开...但是我仍然得到相同的结果。在尝试 setWorldOrigin
后,节点被删除。使用此功能会重置某些东西吗?有什么特别的地方我应该使用它吗? (一些委托(delegate)功能)?
更新
print("\(sceneView.scene.rootNode) --- 渲染器中的 rootNode")
产生:
<SCNNode: 0x1c01f8100 | 111 children> --- rootNode in renderer
所以看起来 rootNode
和它的 children
仍然在某个地方......但是他们要用这么简单和小的转换去哪里?
更新
print("\(sceneView.scene.rootNode.position) --- 渲染器中的 rootNode")
产生:
SCNVector3(x: 0.0, y: 0.0, z: 0.0) --- rootNode in renderer
然而...我没有看到任何 child ...所以 rootNode 似乎在其他地方。
更新
我可以确认转换没有发生......子节点的定位(我看不到)仍然与其原始状态相同(每 2 个网格 block (米)一个节点,即:
SCNVector3(x: 6.0, y: 0.0, z: -4.0) --- rootNode child node
SCNVector3(x: 6.0, y: 0.0, z: -2.0) --- rootNode child node
更新
我现在对这个问题的最狭隘的看法是,即使是简单的旋转也会从 View 中删除节点......因为没有位置变化......这意味着我相信渲染过程正在发生某些事情。
func viewDidLoad() {
...
sceneView.scene = scene
view.addSubview(sceneView)
let angle = coordinateConverter.getUprightMKMapCameraHeading()
print("\(angle) --- angle")
mRotate = matrix_float4x4()
mRotate.columns.3 = [0.0, 0.0, 0.0, 1.0]
mRotate.columns.2 = [Float(sin(angle)), 0.0, Float(cos(angle)), 0.0]
mRotate.columns.1 = [0.0, 0.0, 0.0, 0.0]
mRotate.columns.0 = [Float(cos(angle)), 0.0, Float(-sin(angle)), 0.0]
sceneView.session.setWorldOrigin(relativeTransform: mRotate)
控制台输出:
281.689248803283 --- angle
仍然,虚拟对象仍然不可见,但放置在原点......应该仍然相同。
我还应该注意到标准的 1,1,1,1 转换确实有效...但显然,它什么也没做...但我想仅仅使用该函数并不能使它们消失...它们只会如果你的转换确实做了一些事情就会消失......
...
var identity = matrix_float4x4()
identity.columns.3 = [0.0, 0.0, 0.0, 1.0]
identity.columns.2 = [0.0, 0.0, 1.0, 0.0]
identity.columns.1 = [0.0, 1.0, 0.0, 0.0]
identity.columns.0 = [1.0, 0.0, 0.0, 0.0]
sceneView.session.setWorldOrigin(relativeTransform: identity)
...
以上内容没有进行任何转换...并且节点仍在 View 中。
如果我将矩阵更改为此(按 10,10 翻译):
var identity = matrix_float4x4()
identity.columns.3 = [10.0, 0.0, 10.0, 1.0]
identity.columns.2 = [0.0, 0.0, 1.0, 0.0]
identity.columns.1 = [0.0, 1.0, 0.0, 0.0]
identity.columns.0 = [1.0, 0.0, 0.0, 0.0]
有效...
我只是在想...我是否必须缩小我的世界(真实世界的 MKMapKit 坐标/单位)可能是因为硬件无法处理缩放的世界。另外,从上面的测试中……我想我意识到当你使用这个函数时原点会移动,但节点不会,所以如果我想让节点在变换后保持在我的位置……我需要把它们变回来。尽管如此,结果是一样的:
print("\(transformerFromPDFToMk.tx) -- tx")
print("\(transformerFromPDFToMk.ty) -- ty")
m = matrix_float4x4()
m.columns.3 = [Float(transformerFromPDFToMk.tx), 0.0, Float(transformerFromPDFToMk.ty), 1.0]
m.columns.2 = [0.0, 0.0, 1.0, 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [1.0, 0.0, 0.0, 0.0]
sceneView.session.setWorldOrigin(relativeTransform: m)
for node in scene.rootNode.childNodes {
node.position = SCNVector3Make(-Float(transformerFromPDFToMk.tx) + node.position.x, node.position.y, Float(transformerFromPDFToMk.ty) + node.position.z)
}
控制台输出:
81145547.3824476 -- tx
99399579.5362287 -- ty
更新
我看到了我的对象(有点)!我以为我以前试过这个……但现在它工作得更好了 - 我使用的代码包定义了一个比例尺 (coordinateConverter.unitSizeInMeters
)...我没有正确地转换成它。但是......它们正在快速闪烁......
m = matrix_float4x4()
m.columns.3 = [Float(transformerFromPDFToMk.tx) / Float(coordinateConverter.unitSizeInMeters), 0.0, Float(transformerFromPDFToMk.ty) / Float(coordinateConverter.unitSizeInMeters), 1.0]
m.columns.2 = [0.0, 0.0, 1.0, 0.0]
m.columns.1 = [0.0, 1.0, 0.0, 0.0]
m.columns.0 = [1.0, 0.0, 0.0, 0.0]
sceneView.session.setWorldOrigin(relativeTransform: m)
sceneView.session.setWorldOrigin(relativeTransform: m)
for node in scene.rootNode.childNodes {
node.position = SCNVector3Make(-Float(transformerFromPDFToMk.tx) /
Float(coordinateConverter.unitSizeInMeters) + node.position.x /
Float(coordinateConverter.unitSizeInMeters), node.position.y /
Float(coordinateConverter.unitSizeInMeters), -
Float(transformerFromPDFToMk.ty) /
Float(coordinateConverter.unitSizeInMeters) + node.position.z /
Float(coordinateConverter.unitSizeInMeters))
}
更新
闪烁的“z-fighting”是吗? https://en.wikipedia.org/wiki/Z-fighting
最佳答案
解决缩放问题后,我减小了世界的大小(缩放)并将对象彼此分开一点(以修复闪烁/“z-fighting”)——维基百科的页面非常有帮助,我我很确定我需要做的就是缩小世界大小。
关于ios - ARKit 节点在 sceneView.session.set World Origin 转换后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48919069/
Closed. This question needs details or clarity。它当前不接受答案。 想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。 去
I am learning boost-python from the Tutorial, 但是报错了,你能给我一些提示吗,谢谢! #include using namespace boost::p
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Capitalize First Char of Each Word in a String Java 编写进行以下
很抱歉这个问题的措辞有点疯狂,但我对面向代理的思维非常陌生(这些是“模式”吗?),并且对 java 来说只是稍微不那么新鲜,而且我正在努力解决感觉像非常基本的问题。 我“凭直觉”(即盲目地)做了很多这
是的,所以我正在制作一个沼泽标准 Hello world 以确保 android 正常工作。这是我第一次使用 android,所以我正在设置环境。我按照以下程序制作了程序:http://develop
我正在尝试将“Hello World”变为“World Hello”。但是代码没有按照我希望的方式正常工作。请看下面的代码: #include #include #include struct lln
例如,virt-what显示您是否在硬件虚拟化“沙箱”中运行。 如何检测您是否在 ARM "TrustZone"沙箱中运行? 最佳答案 信任专区 可能和你想的不一样。有一个连续的模式。从“受信任功能的
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
如何使用 CSS 将字符串“Hello world I am Jack”反转为“Jack am I world Hello”? 例如: Hello World ,我是 jack 我想知道如何使用 CS
为什么这段代码抛出 InputMismatchException ? Scanner scanner = new Scanner("hello world"); System.out.println(
require 'csv' s = "\"Hello World\"" CSV.open('output.txt', 'w') do |csv| csv << [s] end 在我的文件中,我
当我尝试这段代码时 char *a[] = {"hello", "world" }; char **p = a; char a[][10]={"hello", "world"}; 我的编译失败了,我被
为什么“第二次世界大战”没有取代“第二次世界大战”? var wha = prompt("What is?"); for (var i = 1; i < wha.length; i++) { if
我刚刚在 Windows XP 上安装了 Python 2.7.2,想学习如何编程。我使用的一些教程书籍提供了打印命令的示例,当我尝试这些命令时,我会得到不同的答案。 我希望这两个返回相同的东西 -
我卸载了android ask并重新安装到没有空格的c:\androidSdktools。所以现在模拟器可以工作了,我可以看到模拟器了。 但尝试了一些“hello world”文本的代码,当我运行应用
在Swift中,下面是什么语法? let (hello, world):(String,String) = ("hello","world") print(hello) //prints "hello
在我的 url 中,我有“?msg=hello+world”,在我的操作中,它将值转换为“hello world” public ActionResult test(string msg) {
正如标题所说,我需要格式化一串文本,格式如下:“HELLO, WORLD. HOW ARE YOU?”进入“你好,世界。你好吗?”,在 iOS 中是否有任何标准方法可以做到这一点?或者有没有示例代码?
我已经开始学习 C++ 并编写了一个“Hello World”程序。当我尝试在命令提示符下运行它时,它崩溃并向我显示一条 Windows 消息“Hello World.exe 已停止工作。”。 代码:
这个问题已经有答案了: member variable string gets treated as Tuple in Python (3 个回答) 已关闭 4 年前。 我是 python 新手,正在
我是一名优秀的程序员,十分优秀!