swift - SceneKit – SCNMatrix4 中的最低行元素是做什么用的?
问题描述
在SCNMatrix4
struct 中,最后一个m44
元素用于齐次坐标。
我想知道SCNMatrix4中的
m41
,m42
和元素是什么?m43
我究竟可以使用这三个元素做什么?
init(m11: Float, m12: Float, m13: Float, m14: Float,
m21: Float, m22: Float, m23: Float, m24: Float,
m31: Float, m32: Float, m33: Float, m34: Float,
m41: Float, m42: Float, m43: Float, m44: Float)
解决方案
我可能是错的,但我认为m41
,m42
和m43
可用于获取位置数据,并且与result.worldTransform.columns.3
执行 hitTest 时使用基本相同。
因此,在放置SCNNode
通过执行时,ARSCNHitTest
您可以使用:
let hitTestTransform = SCNMatrix4(result.worldTransform)
let positionFromMatrix4 = SCNVector3(hitTestTransform.m41, hitTestTransform.m42, hitTestTransform.m43)
let positionFromColumns = SCNVector3(result.worldTransform.columns.3.x, result.worldTransform.columns.3.y, result.worldTransform.columns.3.z)
下面的例子应该有助于澄清事情:
/// Places Our Model At The Position Of An Existining ARPlaneAnchor
///
/// - Parameter gesture: UITapGestureRecognizer
@IBAction func placeModel(_ gesture: UITapGestureRecognizer){
//1. Get The Touch Location
let touchLocation = gesture.location(in: self.augmentedRealityView)
//2. Perform An ARSCNHitTest For Any Existing Planes
guard let result = self.augmentedRealityView.hitTest(touchLocation, types: [.existingPlane, .existingPlaneUsingExtent]).first else { return }
//3. Get The World Transform
let hitTestTransform = SCNMatrix4(result.worldTransform)
//4. Initialize Our Position Either From .m41, .m42, .m43 Or From Columns.3
let positionFromMatrix4 = SCNVector3(hitTestTransform.m41, hitTestTransform.m42, hitTestTransform.m43)
let positionFromColumns = SCNVector3(result.worldTransform.columns.3.x, result.worldTransform.columns.3.y, result.worldTransform.columns.3.z)
//5. Log Them To Check I'm Not Being A Moron
print(
"""
Position From Matrix 4 == \(positionFromMatrix4)
Position From Columns == \(positionFromColumns)
""")
/*
Position From Matrix 4 == SCNVector3(x: -0.39050543, y: -0.004766479, z: 0.08107365)
Position From Columns == SCNVector3(x: -0.39050543, y: -0.004766479, z: 0.08107365)
*/
//6. Add A Node At The Position & Add It To The Hierachy
let boxNode = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0))
boxNode.geometry?.firstMaterial?.diffuse.contents = UIColor.cyan
boxNode.position = positionFromMatrix4
self.augmentedRealityView.scene.rootNode.addChildNode(boxNode)
}
希望能帮助到你...
推荐阅读
- sockets - 如何自动测试网络 (TCP/IP) 应用程序?
- python - 根据第 2 列的条件,使用第 1 列的输入创建新的 df 列
- mysql-workbench - MySQL Workbench:当我编写存储过程时,美化/重新格式化选项不起作用
- javascript - 如何将 JSON 对象从 Javascript 传递到 Python CGI 脚本
- javascript - 在 Node.js 中声明多个 module.exports,TypeError: Router.use() requires a middleware function but got a Object
- azure - 如何在 Azure 中创建负载均衡器(免费试用)
- spring-boot - Spring批处理集成:java.lang.ClassCastException:org.springframework.integration.file.FileReadingMessageSource 无法转换为 java.io.File
- python-3.x - 名称和数据的多个元组中的数据统计
- asp.net-mvc - 为什么我们在 MVC 表单认证中使用 setAuthCookies
- arrays - Robot Framework - 如何在行列表中获取值