代码之家  ›  专栏  ›  技术社区  ›  Deb S

Swift SCNNode 3D立方体旋转到立方体上的一个点

  •  1
  • Deb S  · 技术社区  · 8 年前

    使用lookAtConstraint和in进行了尝试 func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)

     cube = SCNNode(geometry: sphereGeometry)
            cube.position = SCNVector3Make(0.0, 0.0, 0.0)
            gamescn.rootNode.addChildNode(cube)
    
            cameraNode = SCNNode()
            cameraNode.camera = SCNCamera()
            cameraNode.position = SCNVector3(x: 0, y: 0, z: 40)
            gamescn.rootNode.addChildNode(cameraNode)
    
            lookAtConstraint
    
    //        lookAtConstraint = SCNLookAtConstraint(target: cube)
    //        lookAtConstraint.isGimbalLockEnabled = true
    //        cameraNode.constraints = [lookAtConstraint]
    

    还试图获得第一个中心点的偏差(初始[0,0,距中心的距离])-然后 cube.eulerAngles = deviation 但立方体是随机旋转的。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Deb S    8 年前

    我是如何做到这一点的-

    建立了两个效用函数来获取asin&两点夹角的acos复合-

    func angleBetweenVectorsCos(_ vectorB:SCNVector3) -> SCNFloat {
            let cosineAngle = (dot(vector: vectorB) / (magnitude * vectorB.magnitude))
            return SCNFloat(acos(cosineAngle))
    }
    
    func angleBetweenVectorsSin(_ vectorB:SCNVector3) -> SCNFloat {
            let cosineAngle = angleBetweenVectorsCos(vectorB)
            let sinangle = sqrt(1-cosineAngle*cosineAngle)
            return SCNFloat(acos(sinangle))
     }
    

    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval)

    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
            if time > rotationTimer{
    
    
                let angleCos = lastposition.angleBetweenVectorsCos(movingTarget.position)
                let angleSin = lastposition.angleBetweenVectorsSin(movingTarget.position)
                SCNTransaction.begin()
                SCNTransaction.animationDuration = 0.5
                xDegree += angleSin
                yDegree += angleCos
                zDegree += 0
    
                if vMove {
                    cube.eulerAngles.x =  xDegree
                }
                if hMove {
                    cube.eulerAngles.y =  -yDegree
                }
    
    
                SCNTransaction.commit()
                lastposition = movingTarget.position
                .......    
                rotationTimer = time + 0.2
            }
    
        }
    

    如何获得vMove(垂直移动)和hMove(水平移动)-通过检测到距离原点的距离,仅计算移动对象所在的曲面。

    我为此做了完整的github回购。 See this and suggest some improvements