swift - 如何在 Swift (ARKit, SCNKit) 中创建带起点和终点的线
问题描述
我想创建一条线,我可以告诉它在 ARKit 的场景中从哪里开始和在哪里结束。其他人做了这门课,但我得到了错误。像 node... 的 startLine 和 node... 的 endLine 这样简单的东西会很有帮助。我觉得在两点之间做一条简单的线不应该那么复杂,所以如果你的答案很复杂,请解释为什么必须这样。谢谢大家的帮助!
class LineNode: SCNNode {
private(set) var cylinder: SCNCylinder
private(set) var positionA: SCNVector3
private(set) var positionB: SCNVector3
init(with startingPoint: SCNVector3, endPoint: SCNVector3, radius: Float = 0.02, color: UIColor = .red) {
self.positionA = startingPoint
self.positionB = endPoint
let vector = endPoint - startingPoint *//error*
let height = vector.length()
cylinder = SCNCylinder(radius: radius, height: Float(height))
cylinder.radialSegmentCount = 8
cylinder.firstMaterial?.diffuse.contents = color
super.init()
geometry = cylinder
position = (endPoint + startingPoint) / 2 *//error*
eulerAngles = SCNVector3.lineEulerAngles(vector: vector)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
// 我得到错误:二元运算符“-”不能应用于两个“SCNVector3”操作数
解决方案
SCNVector3 是一个结构,而不是一个类。您不能应用“-”运算符。
所以我们可以使用旧值创建另一个 SCNVector3。
let vector = SCNVector3(endPoint.x - startingPoint.x, startingPoint.y, startingPoint.z)
推荐阅读
- java - 如果 @RequestBody 中不存在布尔值,则将其设置为 false
- php - 如何将字符串中的中文字符移动到字符串的末尾?
- android - 在 RecyclerView 中清除了 EditText onSubmit 函数
- python - 使用 dask 在网格上广播并行函数的问题
- python - 提供保存我的模型的路径。(/content/drive/My Drive/training) ,但“我的驱动器”中的空间会引发错误
- google-apps-script - 如何使用谷歌应用脚本从单独的数据构建日期?
- node.js - Electron 作为 Web 浏览器的安全隐患
- powershell - 用于修改 zip 文件夹中的 .dat 文件的 Powershell 脚本
- r - 关闭应用程序后保存对数据表所做的更改 (R)
- javascript - 在 JavaScript ES6 中,可迭代对象和迭代器有什么区别?