Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 4点之间的Scenekit形状_Swift_Scenekit_Arkit - Fatal编程技术网

Swift 4点之间的Scenekit形状

Swift 4点之间的Scenekit形状,swift,scenekit,arkit,Swift,Scenekit,Arkit,考虑到我在前一个问题中所走的路线: …似乎有缺陷,我正在考虑其他选择。我可以在两个节点之间画一条线,然后我可以在这些节点之上创建节点,有效地在一个正方形中,但即使我在它们之间画线,我也不能把它们做成一个形状。是否可以在Scenekit中绘制一个形状(正方形),其中4个角中的每个角都连接到一个节点 我可以创建一个平面,将其放置在一个节点上,变换轴,然后旋转,但它并不总是起作用,但SCN测量线起作用 谢谢所以答案是,至少我的解决方案是使用三角测量法。我想要一个正方形(而不是立方体)作为增强现实中的

考虑到我在前一个问题中所走的路线:

…似乎有缺陷,我正在考虑其他选择。我可以在两个节点之间画一条线,然后我可以在这些节点之上创建节点,有效地在一个正方形中,但即使我在它们之间画线,我也不能把它们做成一个形状。是否可以在Scenekit中绘制一个形状(正方形),其中4个角中的每个角都连接到一个节点

我可以创建一个平面,将其放置在一个节点上,变换轴,然后旋转,但它并不总是起作用,但SCN测量线起作用


谢谢

所以答案是,至少我的解决方案是使用三角测量法。我想要一个正方形(而不是立方体)作为增强现实中的墙,所以我只需使用映射墙的4个角的4个节点构建2个三角形

要构建三角形的类:

extension SCNGeometry {

    class func triangleFrom(vector1: SCNVector3, vector2: SCNVector3, vector3: SCNVector3) -> SCNGeometry {

        let indices: [Int32] = [0, 1, 2]

        let source = SCNGeometrySource(vertices: [vector1, vector2, vector3])

        let element = SCNGeometryElement(indices: indices, primitiveType: .triangles)

        return SCNGeometry(sources: [source], elements: [element])
    }
}
这两个三角形的点是[p1,p2,p4]和[p1,p3,p4],使用以下方法调用:

let thirdPoint = firstPoint.clone()
thirdPoint.position = SCNVector3Make(thirdPoint.position.x, 
thirdPoint.position.y + Float(1.5), thirdPoint.position.z)
sceneView.scene.rootNode.addChildNode(thirdPoint)

let fourthPoint = secondPoint.clone()
fourthPoint.position = SCNVector3Make(fourthPoint.position.x, 
fourthPoint.position.y + Float(1.5), fourthPoint.position.z)
sceneView.scene.rootNode.addChildNode(fourthPoint)

let triangle = SCNGeometry.triangleFrom(vector1: firstPoint.position, vector2: secondPoint.position, vector3: fourthPoint.position)
let triangleNode = SCNNode(geometry: triangle)
triangleNode.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
triangleNode.geometry?.firstMaterial?.isDoubleSided = true
sceneView.scene.rootNode.addChildNode(triangleNode)

let triangle2 = SCNGeometry.triangleFrom(vector1: firstPoint.position, vector2: thirdPoint.position, vector3: fourthPoint.position)
let triangle2Node = SCNNode(geometry: triangle2)
triangle2Node.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
triangle2Node.geometry?.firstMaterial?.isDoubleSided = true
sceneView.scene.rootNode.addChildNode(triangle2Node)
这都基于通过在ARKit中选择墙的底部2个点来创建2个初始节点

希望这对其他寻求类似答案的人来说是有意义的

编辑:添加材质

这是一个稍有不同的扩展和代码,用于向其中添加材质,墙的最终结果保持不变:

extension SCNGeometry {

    class func Quad() -> SCNGeometry {

        let verticesPosition = [
            SCNVector3(x: -0.242548823, y: -0.188490361, z: -0.0887458622),
            SCNVector3(x: -0.129298389, y: -0.188490361, z: -0.0820985138),
            SCNVector3(x: -0.129298389, y: 0.2, z: -0.0820985138),
            SCNVector3(x: -0.242548823, y: 0.2, z: -0.0887458622)
        ]

        let textureCord = [
            CGPoint(x: 1, y: 1),
            CGPoint(x: 0, y: 1),
            CGPoint(x: 0, y: 0),
            CGPoint(x: 1, y: 0),
        ]

        let indices: [CInt] = [
            0, 2, 3,
            0, 1, 2
        ]

        let vertexSource = SCNGeometrySource(vertices: verticesPosition)
        let srcTex = SCNGeometrySource(textureCoordinates: textureCord)
        let date = NSData(bytes: indices, length: MemoryLayout<CInt>.size * indices.count)

        let scngeometry = SCNGeometryElement(data: date as Data, 
primitiveType: SCNGeometryPrimitiveType.triangles, primitiveCount: 2, 
bytesPerIndex: MemoryLayout<CInt>.size)

        let geometry = SCNGeometry(sources: [vertexSource,srcTex], 
elements: [scngeometry])

        return geometry


    }

}

谢谢你,通过你的扩展,我创建了一个有三个向量的三角形。@ondermerol没问题,很高兴它能帮上忙。你能告诉我如何将图像添加到两个SCNGeometry三角形中吗?48小时左右的有限互联网。您需要向形状添加材质。如果你还没有解决它,我可以在周末把一些东西放在一起。
SCNGeometryPrimitiveType
也支持
多边形
,所以我认为不再需要用两个单独的三角形来做了。
let scene = SCNScene()

let quad = SCNGeometry.Quad()

let (min, max) = quad.boundingBox

let width = CGFloat(max.x - min.x)
let height = CGFloat(max.y - min.y)

quad.firstMaterial?.diffuse.contents = UIImage(named: "wallpaper.jpg")
quad.firstMaterial?.diffuse.contentsTransform = SCNMatrix4MakeScale(Float(width), Float(height), 1)
quad.firstMaterial?.diffuse.wrapS = SCNWrapMode.repeat
quad.firstMaterial?.diffuse.wrapT = SCNWrapMode.repeat

let node = SCNNode()
node.geometry = quad
scene.rootNode.addChildNode(node)

sceneView.scene = scene