我陷入困境:让dqm = SCNQuaternion.Multiply ……
SceneKit没有名为multiply的成员.
知道我怎么能这样做吗?
let rr = CMAttitudeReferenceFrame.XArbitraryCorrectedZVertical this.motion.DeviceMotionUpdateInterval <- float (1.0f / 30.0f) this.motion.StartDeviceMotionUpdates (rr,NSOperationQueue.CurrentQueue,(fun d e -> let a = this.motion.DeviceMotion.Attitude let q = a.Quaternion let dq = new SCNQuaternion(float32 q.x,float32 q.y,float32 q.z,float32 q.w) let dqm = SCNQuaternion.Multiply (dq,SCNQuaternion.FromAxisAngle(SCNVector3.UnitZ,piover2)) camNode.OrIEntation <- dqm () ))解决方法 SceneKit不包含用于执行四元数数学的库. SCNQuaternion只是SCNVector4的一个类型别名 – 换句话说,它是一个容纳四元数的四个系数的地方,但你可以自己动手来解释或使用它们.
在Xcode 9 / iOS 11 / macOS 10.13 High SIErra / etc中,有一种更好的方法来处理SceneKit中的四元数(和其他向量/矩阵数学):SIMD库包括两个四元数类型(用于double和float),以及SceneKit重复所有SCNVector / SCNMatrix / SCNQuaternion访问器都提供SIMD版本.使用SIMD类型而不是SCN类型有很多很好的理由:
> SIMD类型用于多个iOS / macOS / etc框架,因此您可以使用它们在(例如)SceneKit,ARKit和Model I / O之间传递矢量/矩阵/四元数值,而无需进行转换或转换.
>金属着色器语言为其矢量/矩阵类型使用相同的库,因此您的数学代码可以在cpu和GPU之间轻松移植.
>在Swift中,SIMD类型显示为具有初始化器,属性和方法的结构,因此大多数(*)代码都可以是Swift友好的.
>在Swift和C中,运算符重载涵盖了所有基本 *** 作,因此您的数学代码和读写都像数学一样.
>所有上述内容都是使用编译器内在函数实现的,因此它们使用运行代码的cpu的本机向量指令集(x86 SSE,ARM NEON)来快速执行.
不幸的是,CoreMotion还没有采用SIMD库来实现其矢量/矩阵/四元数类型,因此在使用SIMD函数或基于SceneKit SIMD的API之前,您需要将输入CMQuaternion转换为simd_quatf.如果您发现自己经常这样做,您可能需要一个扩展名:
extension simd_quatf { init(_ cmq: CMQuaternion) { self.init(ix: float(cmq.x),iy: float(cmq.y),iz: float(cmq.z),r: float(cmq.w)) }}
然后(假设我正在阅读你的F#),你的代码在Swift中会变成这样:
let zAxis = float3(x: 0,y: 0,z: 1)let rotateAroundZ = simd_quatf(angle: .pi/2,axis: zAxis)manager.startDeviceMotionUpdates(using: .xArbitraryZVertical,to: queue) { motion,error in guard let motion = motion else { /* handle error and */ return } let deviceQuaternion = simd_quatf(motion.attitude.quaternion) cameraNode.simdOrIEntation = deviceQuaternion * rotateAroundZ}
(*) Some of the useful SIMD operations are still C-style global functions: Check
simd/quaternion.h
for stuff like slerp and BézIEr interpolation.
对于早期的Xcode / SDK版本……
>在Xcode 9 / iOS 11 / macOS 10.13 / etc之前,SIMD中没有四元数,而且SceneKit中没有特定于SIMD的访问器.对于除四元数之外的所有内容,获取SCN类型,将它们按组件方式转换为等效的SIMD类型并在那里进行数学运算仍然很有用.
> Apple确实在GLKit中发布了一个四元数库.使用@L_301_1@从SCNQuaternion的四个组件中创建GLKQuaternion.然后你可以将它乘以,slerp它,无论使用GLKQuaternion函数.完成后,使用结果的组件来创建另一个SCNQuaternion.>在Swift 1.x(Xcode 6.x)中,Swift无法使用SIMD库. GLKit数学是一个不错的替代品,但你最好只使用更新的Xcode – 记住你可以一直回到iOS 7 / macOS 10.9 Mavericks甚至使用Swift 4(并且SIMD库可以追溯到iOS 8 / macOS 10.10 Yosemite).
以上是内存溢出为你收集整理的ios – SCNQuaternion乘法全部内容,希望文章能够帮你解决ios – SCNQuaternion乘法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)