大佬教程收集整理的这篇文章主要介绍了swift – 获取节点scenekit中顶点的位置,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
let positions = [SCNVector3Make( 0,-0.1,0),SCNVector3Make( 0.3,SCNVector3Make( 0,0.1,] let inDices :[UInt16] = [ 0,1,2,3,] let vertexsource = SCNGeometrysource(vertices: positions,count: 4) let indexData = NSData(bytes: inDices,length: MemoryLayout<CInt>.size * inDices.count) let newElement = SCNGeometryElement(data: NSData(bytes: inDices,length: inDices.count * MemoryLayout<Int16>.sizE) as Data,primitiveType: .triangles,primitiveCount: 2,bytesPerIndex: MemoryLayout<Int16>.sizE) let geometry = SCNGeometry(sources: [vertexsource],elements: [newElement]) custom = SCNNode(geometry: geometry) scene.rootNode.addChildNode(custom!) custom?.position = SCNVector3Make(0,0)@H_262_11@我认为这可以通过变换完成,但是自定义变换有很多奇怪的东西,比如m11,m12,m13,我不明白.
SceneKit将存储用于以原始比例/基础生成节点的几何体的坐标.创建对象后,这些不会更改.对于像SCNPlane或SCNBox这样的原语,这些几何在场景中共享.因此,如果您有一堆不同的平面或框,所有处于不同的位置,旋转和缩放,当您查询SCNGeometrysource时,您将获得相同的顶点.这里有一个很好的讨论检索:Extracting vertices from scenekit.但是这种方法不会给你本地坐标空间的角落.
我们有两个适用于SCNNode和SCNGeometry的函数:boundingBox和boundingSphere(它们在协议SCNBoundingVolume
中定义). boundingBox为您提供两个点,最小值和最大值.从立方体的两个相对角,您可以找出平面的角顶点.但是还有另一个复杂因素.这两个函数都在本地坐标(节点本身使用的坐标系)中返回它们的答案.所以我们仍然卡住了:我的每架飞机或箱子都有相同的边界框.
我想出的答案是使用SCNNode的convertPosition(_,to:nodE),传递场景的根节点.这最终给了我根节点坐标空间中的边界框.
for node in [custom1,custom2,plainPlane1,plainPlane2] { print(node.name!) print(node.boundingBox.maX) print(node.boundingBox.min) print(node.convertPosition(node.boundingBox.min,to: scene.rootNodE)) print(node.convertPosition(node.boundingBox.max,to: scene.rootNodE)) }@H_262_11@生产
custom 1 SCNVector3(x: 0.300000011920929,y: 0.100000001490116,z: 0.0) SCNVector3(x: 0.0,y: -0.100000001490116,z: -1.0) SCNVector3(x: 0.300000011920929,z: -1.0) custom 2 SCNVector3(x: 0.300000011920929,z: 0.0) SCNVector3(x: 0.200000002980232,y: 0.429289322037836,z: -1.07071067796216) SCNVector3(x: 0.500000014901161,y: 0.570710677962164,z: -0.929289322037836) plain plane 1 SCNVector3(x: 0.5,y: 1.0,z: 0.0) SCNVector3(x: -0.5,y: -1.0,z: -2.0) SCNVector3(x: 0.5,z: -2.0) plain plane 2 SCNVector3(x: 0.5,z: 0.0) SCNVector3(x: -9.18485139438876e-18,y: -0.300000011920929,z: -1.84999999403954) SCNVector3(x: 9.18485139438876e-18,y: 0.300000011920929,z: -2.15000000596046) @H_262_11@这是下面的完整macOS游乐场:
//: Playground - noun: a place where people can play import Cocoa import SceneKit import PlaygroundSupport let positions = [SCNVector3Make( 0,] let inDices :[UInt16] = [ 0,] let vertexsource = SCNGeometrysource(vertices: positions,count: 4) let indexData = NSData(bytes: inDices,length: MemoryLayout.size * inDices.count) let newElement = SCNGeometryElement(data: NSData(bytes: inDices,length: inDices.count * MemoryLayout.sizE) as Data,bytesPerIndex: MemoryLayout.sizE) let sceneView = SCNView(frame: CGRect(x: 0,y: 0,width: 600,height: 400)) sceneView.allowsCameraControl = true sceneView.autoenablesDefaultLighTing = true sceneView.BACkgroundColor = NSColor.darkGray sceneView.showsStatistics = true PlaygroundPage.current.liveView = sceneView let scene = SCNScene() sceneView.scene = scene let geometry = SCNGeometry(sources: [vertexsource],elements: [newElement]) geometry.firstMaterial?.diffuse.contents = NSColor.red geometry.firstMaterial?.isDoubleSided = true let custom1 = SCNNode(geometry: geometry) custom1.position = SCNVector3Make(0,-1) custom1.name = "custom 1" scene.rootNode.addChildNode(custom1) let custom2 = SCNNode(geometry: geometry) custom2.position = SCNVector3Make(0.2,0.5,-1) custom2.rotation = SCNVector4Make(1,CGFloat(M_PI_4)) custom2.name = "custom 2" scene.rootNode.addChildNode(custom2) let plainPlaneGeometry = SCNPlane(width: 1,height: 2) plainPlaneGeometry.firstMaterial?.diffuse.contents = NSColor.yellow plainPlaneGeometry.firstMaterial?.isDoubleSided = true let plainPlane1 = SCNNode(geometry: plainPlaneGeometry) plainPlane1.position = SCNVector3Make(0,-2) plainPlane1.name = "plain plane 1" scene.rootNode.addChildNode(plainPlane1) let plainPlane2 = SCNNode(geometry: plainPlaneGeometry) plainPlane2.position = SCNVector3Make(0,-2) plainPlane2.rotation = SCNVector4Make(0,CGFloat(M_PI_2)) plainPlane2.scale = SCNVector3Make(0.3,0.3,0.3) plainPlane2.name = "plain plane 2" scene.rootNode.addChildNode(plainPlane2) for node in [custom1,plainPlane2] { print(node.name!) print(node.boundingBox.maX) print(node.boundingBox.min) // print(node.transform) print(node.convertPosition(node.boundingBox.min,to: scene.rootNodE)) } @H_262_11@你提到了转换矩阵.有一个很好的解释它看起来是什么样的,它是如何在Need better and simpler understanding of CATransform3D工作的(引用了两篇优秀的维基百科文章),以及一个易于理解的概述于http://sketchytech.blogspot.com/2014/12/explaining-catransform3d-matrix.html.
以上是大佬教程为你收集整理的swift – 获取节点scenekit中顶点的位置全部内容,希望文章能够帮你解决swift – 获取节点scenekit中顶点的位置所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。