swift – 在两点之间绘制SceneKit对象

swift – 在两点之间绘制SceneKit对象,第1张

概述在 geometry side件事上取得了一些进展,我正在整理整个场景.该场景有几十个对象,每个对象由一个边界立方体定义,其边角由两个SCNVector3指定(最初是两组x,y,z). 这是我到目前为止所拥有的一个例子 – 它是一个11元素的对数周期天线,就像70年代的旧式电视天线一样.每条灰线是“元件”,通常由铝棒制成.我使用了从ve到-ve Y的SCNCylinders,整个东西不到100行( 在 geometry side件事上取得了一些进展,我正在整理整个场景.该场景有几十个对象,每个对象由一个边界立方体定义,其边角由两个SCNVector3指定(最初是两组x,y,z).

这是我到目前为止所拥有的一个例子 – 它是一个11元素的对数周期天线,就像70年代的旧式电视天线一样.每条灰线是“元件”,通常由铝棒制成.我使用了从ve到-ve Y的SCNCylinders,整个东西不到100行(SK非常棒).

如果元素在X上不对称并且因此必须旋转SCNCylinder,则会出现问题.我找到了this example,但我无法理解具体细节……它似乎利用了一个球体是对称的这一事实,所以角度有点“消失”.

有没有人有一个通用的功能,它将采取两个3D点并返回适合设置节点的eulerAngle的SCNVector3,或类似的解决方案?

上面提到的两种解决方案都运行良好,我可以为这个问题提供第三种解决方案
//extension code startsfunc normalizeVector(_ iv: SCNVector3) -> SCNVector3 {    let length = sqrt(iv.x * iv.x + iv.y * iv.y + iv.z * iv.z)    if length == 0 {        return SCNVector3(0.0,0.0,0.0)    }    return SCNVector3( iv.x / length,iv.y / length,iv.z / length)}extension SCNNode {    func buildlineInTwoPointsWithRotation(from startPoint: SCNVector3,to endPoint: SCNVector3,radius: CGfloat,color: UIcolor) -> SCNNode {        let w = SCNVector3(x: endPoint.x-startPoint.x,y: endPoint.y-startPoint.y,z: endPoint.z-startPoint.z)        let l = CGfloat(sqrt(w.x * w.x + w.y * w.y + w.z * w.z))        if l == 0.0 {            // two points together.            let sphere = SCNSphere(radius: radius)            sphere.firstMaterial?.diffuse.contents = color            self.geometry = sphere            self.position = startPoint            return self        }        let cyl = SCNCylinder(radius: radius,height: l)        cyl.firstMaterial?.diffuse.contents = color        self.geometry = cyl        //original vector of cylinder above 0,0        let ov = SCNVector3(0,l/2.0,0)        //target vector,in new coordination        let nv = SCNVector3((endPoint.x - startPoint.x)/2.0,(endPoint.y - startPoint.y)/2.0,(endPoint.z-startPoint.z)/2.0)        // axis between two vector        let av = SCNVector3( (ov.x + nv.x)/2.0,(ov.y+nv.y)/2.0,(ov.z+nv.z)/2.0)        //normalized axis vector        let av_normalized = normalizeVector(av)        let q0 = float(0.0) //cos(angel/2),angle is always 180 or M_PI        let q1 = float(av_normalized.x) // x' * sin(angle/2)        let q2 = float(av_normalized.y) // y' * sin(angle/2)        let q3 = float(av_normalized.z) // z' * sin(angle/2)        let r_m11 = q0 * q0 + q1 * q1 - q2 * q2 - q3 * q3        let r_m12 = 2 * q1 * q2 + 2 * q0 * q3        let r_m13 = 2 * q1 * q3 - 2 * q0 * q2        let r_m21 = 2 * q1 * q2 - 2 * q0 * q3        let r_m22 = q0 * q0 - q1 * q1 + q2 * q2 - q3 * q3        let r_m23 = 2 * q2 * q3 + 2 * q0 * q1        let r_m31 = 2 * q1 * q3 + 2 * q0 * q2        let r_m32 = 2 * q2 * q3 - 2 * q0 * q1        let r_m33 = q0 * q0 - q1 * q1 - q2 * q2 + q3 * q3        self.transform.m11 = r_m11        self.transform.m12 = r_m12        self.transform.m13 = r_m13        self.transform.m14 = 0.0        self.transform.m21 = r_m21        self.transform.m22 = r_m22        self.transform.m23 = r_m23        self.transform.m24 = 0.0        self.transform.m31 = r_m31        self.transform.m32 = r_m32        self.transform.m33 = r_m33        self.transform.m34 = 0.0        self.transform.m41 = (startPoint.x + endPoint.x) / 2.0        self.transform.m42 = (startPoint.y + endPoint.y) / 2.0        self.transform.m43 = (startPoint.z + endPoint.z) / 2.0        self.transform.m44 = 1.0        return self    }}//extension ended.//in your code,you can like this.let twoPointsNode1 = SCNNode()        scene.rootNode.addChildNode(twoPointsNode1.buildlineInTwoPointsWithRotation(            from: SCNVector3(1,-1,3),to: SCNVector3( 7,11,7),radius: 0.2,color: .cyan))//end

你可以参考http://danceswithcode.net/engineeringnotes/quaternions/quaternions.html

顺便说一下,当你使用圆柱体从3种方法中的两点之间划线时,你会得到相同的结果.但实际上,它们会有不同的正常线条.换句话说,如果你在两点之间使用盒子,盒子的两侧除了顶部和底部之外,将面向与上述3种方法不同的方向.

如果您需要进一步解释,请告诉我.

总结

以上是内存溢出为你收集整理的swift – 在两点之间绘制SceneKit对象全部内容,希望文章能够帮你解决swift – 在两点之间绘制SceneKit对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1029466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存