gpt4 book ai didi

ios - 在 SceneKit 中将形状添加到球体表面

转载 作者:搜寻专家 更新时间:2023-10-31 21:57:31 25 4
gpt4 key购买 nike

我希望能够使用 SceneKit 将形状添加到球体表面。我从一个简单的例子开始,我只是想给球体表面的一部分涂上另一种颜色。我希望这是一个可以点击、选择等的对象...所以我的想法是使用自定义 SCNShape 对象将形状添加为 SCNNodes 几何.

我现在拥有的是一个蓝色正方形,我从一系列点绘制并添加到包含红色球体的场景中。它基本上最终与球体上的一个点相切,但真正的目标是将它绘制在表面上。 SceneKit 中有什么可以让我这样做的吗?我是否需要做一些数学/几何学来使它的形状与球体相同或映射到球体的坐标?我正在尝试做的事情超出了 SceneKit 的范围吗?

如果这个问题太宽泛,如果有人能指出我的书籍或资源以了解我所缺少的东西,我会很高兴。总的来说,我对 SceneKit 和 3D 完全陌生,只是乐于尝试一些想法。

这是我现在拥有的一些 Playground 代码:

import UIKit
import SceneKit
import XCPlayground

class SceneViewController: UIViewController {

let sceneView = SCNView()

private lazy var sphere: SCNSphere = {
let sphere = SCNSphere(radius: 100.0)
sphere.materials = [self.surfaceMaterial]
return sphere
}()

private lazy var testScene: SCNScene = {
let scene = SCNScene()
let sphereNode: SCNNode = SCNNode(geometry: self.sphere)
sphereNode.addChildNode(self.blueChildNode)

scene.rootNode.addChildNode(sphereNode)
//scene.rootNode.addChildNode(self.blueChildNode)
return scene
}()

private lazy var surfaceMaterial: SCNMaterial = {
let material = SCNMaterial()
material.diffuse.contents = UIColor.redColor()
material.specular.contents = UIColor(white: 0.6, alpha: 1.0)
material.shininess = 0.3
return material
}()

private lazy var blueChildNode: SCNNode = {
let node: SCNNode = SCNNode(geometry: self.blueGeometry)
node.position = SCNVector3(0, 0, 100)
return node
}()

private lazy var blueGeometry: SCNShape = {
let points: [CGPoint] = [
CGPointMake(0, 0),
CGPointMake(50, 0),
CGPointMake(50, 50),
CGPointMake(0, 50),
CGPointMake(0, 0)]

var pathRef: CGMutablePathRef = CGPathCreateMutable()
CGPathAddLines(pathRef, nil, points, points.count)

let bezierPath: UIBezierPath = UIBezierPath(CGPath: pathRef)
let shape = SCNShape(path: bezierPath, extrusionDepth: 1)
shape.materials = [self.blueNodeMaterial]
return shape
}()

private lazy var blueNodeMaterial: SCNMaterial = {
let material = SCNMaterial()
material.diffuse.contents = UIColor.blueColor()
return material
}()

override func viewDidLoad() {
super.viewDidLoad()

sceneView.frame = self.view.bounds
sceneView.backgroundColor = UIColor.blackColor()
self.view.addSubview(sceneView)

sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true

sceneView.scene = testScene
}
}

XCPShowView("SceneKit", view: SceneViewController().view)

最佳答案

如果您想将 2D 内容映射到 3D SceneKit 对象的表面,并使 2D 内容动态/交互,最简单的解决方案之一是对 2D 内容使用 SpriteKit。您可以将球体的漫反射内容设置为 SKScene,并在该场景中创建/定位/装饰 SpriteKit 节点以将它们排列在球体的表面上。

如果你想让这个内容响应点击事件......在你的 SceneKit View 中使用 hitTest 得到一个 SCNHitTestResult,你可以从中得到纹理坐标为球体上的命中点。您可以从纹理坐标转换为 SKScene 坐标并生成节点、运行操作或其他任何内容。

有关更多详细信息,最好的选择可能是 Apple 的 SceneKitReel示例代码项目。这是在 WWDC14 上介绍 SceneKit for iOS 的演示。在该演示中有一个“幻灯片”,其中油漆球从相机飞出旋转的环面并在它们撞击它的地方留下油漆飞溅 - 环面有一个 SpriteKit 场景作为其 Material ,并且在碰撞时留下飞溅的技巧基本相同 HitTest -> 纹理坐标 -> 上面概述的 SpriteKit 坐标方法。

关于ios - 在 SceneKit 中将形状添加到球体表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35023170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com