我正在构建一个应用程序,它使用Scenekit根据从数据库返回的信息显示场景.我创建了一个带有类func的自定义类,它创建了一个包含需要绘制的所有内容的SCNNode并将其返回给我的SCNView.在调用此函数之前,我删除任何现有节点.一切都很好,直到我需要第二次调用它.删除旧SCNNode后,在创建新内存之前不会释放内存.有没有标准的方法来删除和替换SCNNode而不会使内存过载?我是iOS开发人员的新手,之前从未真正做过图像.谢谢
我正在使用ARKit开展一个小项目.我希望能够在点击时将对象添加到我的AR SceneView,用双击删除它们,然后用平移或拖动拖动主题.
放置对象的初始点击工作正常,但我在移除节点和拖动时遇到了一些问题.
删除和拖动的主要问题是实际上"保持"或单击SCNNode非常困难.大多数结果都没有出现在我添加的SCNNode上.
第二个问题是拖动有点儿错误,SCNNode实际上并没有像我的手指那样在拖动上移动.
我决定在github上创建一个项目,链接在这里:https://github.com/theraad/ARAttempt
但我也会发布我的代码来删除对象并拖动对象:
-(void)handleRemoveObject:(UITapGestureRecognizer *)recognizer {
NSLog(@"Long Press Fired");
CGPoint tapPoint = [recognizer locationInView:_sceneView];
NSArray <SCNHitTestResult *> *result = [self.sceneView hitTest:tapPoint options:nil];
if ([result count] == 0) {
return;
}
SCNHitTestResult *hitResult = [result firstObject];
if (hitResult.node) {
[[hitResult.node parentNode] removeFromParentNode];
}
}
-(void)moveObject:(UIPanGestureRecognizer *)recognizer {
NSLog(@"Move object");
if (recognizer.state == UIGestureRecognizerStateBegan) {
NSLog(@"Pan state began");
CGPoint tapPoint = [recognizer locationInView:_sceneView];
NSArray <SCNHitTestResult *> *result = [self.sceneView hitTest:tapPoint options:nil];
if ([result count] == …Run Code Online (Sandbox Code Playgroud) 我有一个简单的Swift ARKit设置,其中有一个带有3D对象的SCNNode,该对象在ARSCNView中可见。
我想确定该对象在ARSCNView上的2D坐标。我的意思是指将对象绘制到屏幕上时的x和y坐标。
我提供了一个草图来说明我的意思:

有没有办法获得这些坐标,或者至少是一个近似值?我需要这样做,以便对相机框架进行进一步的处理。基本上,我对对象在屏幕上占据的区域感兴趣。
我在SceneKit应用程序中发现了一个主要的性能瓶颈,原因是该嵌套循环运行了数千次。在该循环中,除了这一行以外,有一堆代码非常愉快地缩放:
var scenePos = presentation.position
Run Code Online (Sandbox Code Playgroud)
这比只要求位置要慢100倍,再加上我在同一循环中所做的数十种其他计算,比较,数组查找和方法调用的组合。令我惊讶的是,似乎没有人对此发表评论。
为什么会这样,除了为每个节点的演示文稿制作副本之外,还有其他解决方法。为每个帧定位自己,这样您就不必一直向演示节点询问它了吗?谢谢。
编辑:presentation.position仅被读取,从未被写入。永远不会编辑boundingBox。我为几个SCNNode使用了动态SCNPhysicsBody,但绝大多数是静态的。
我有一个使用SpriteKit和发射器粒子(sks)的应用程序,我发现它不像Scene kit的粒子(scnp)那么逼真.所以我希望将其纳入SKScene,但我不确定这是否可行.所以我决定创建一个SCNScene和粒子(scnp).但是我想添加背景图像,唯一的3D效果就是粒子.任何人都可以帮我设置我的SCNScene的背景图像.传统上我会将它添加到SKScene,但我无法在线找到任何有关SceneKit的帮助.
let backgroundNode = SKSpriteNode(imageNamed: "backgroundImage")
backgroundNode.size = view.frame.size
backgroundNode.position = CGPointMake(view.frame.size.width/2, view.frame.height/2)
self.addChild(backgroundNode)
Run Code Online (Sandbox Code Playgroud)
先感谢您
目标是增加SCNBox的长度,使其仅在正z方向上生长.
这个答案建议玩pivot房产.
但是,该pivot属性的文档在SCNNode页面上是稀疏的,并且SCNBox页面上没有任何内容.
有人可以解释该pivot物业的运作方式吗?
试图弄清楚如何创建一个以多边形为PrimitiveType的SCNGeometry,我的目标是添加多边形形状的节点作为球面节点的子节点,并使它看起来像MKPolygon的地图工具包,如本例所示。
我当前的代码是:
//Take an arbitrary array of vectors
let vertices: [SCNVector3] = [
SCNVector3Make(-0.1304485, 0.551937, 0.8236193),
SCNVector3Make(0.01393811, 0.601815, 0.7985139),
SCNVector3Make(0.2971005, 0.5591929, 0.7739732),
SCNVector3Make(0.4516893, 0.5150381, 0.7285002),
SCNVector3Make(0.4629132, 0.4383712, 0.7704169),
SCNVector3Make(0.1333823, 0.5224985, 0.8421428),
SCNVector3Make(-0.1684743, 0.4694716, 0.8667254)]
//Does polygon shape require indices?
let indices: [Int] = [0,1,2,3,4,5,6]
let vertexSource = SCNGeometrySource(vertices: vertices)
let indexData = Data(bytes: indices, count: indices.count * MemoryLayout<Int>.size)
//Note!!! I get compiler error if primitiveCount is greater than 0
let element = SCNGeometryElement(data: indexData, primitiveType: .polygon, primitiveCount: 0, …Run Code Online (Sandbox Code Playgroud) 我正在尝试旋转节点SCNAction,但它相对于父坐标空间旋转.是否可以相对于本地坐标系旋转节点?
I have to make a SCNCylinder to look like a dynamic pie chart, I am able to make it look like static pie chart by adding texture or applying color to SCNCylinder with below code. However, my pie chart values changes randomly and want to add material with color values occupying percentage portion of the cylinder.
var planet : SCNGeometry
planet = SCNCylinder(radius: 0.2, height: 0.05)
let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "texture.jpg")
//OR to apply single color
material.diffuse.contents …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 ARKit 的语音气泡中创建一个带有简单文本的报价生成器。
我可以用文本显示语音气泡,但文本始终从中间开始并溢出到语音气泡之外。
任何帮助让它在语音气泡的左上角对齐并包裹在语音气泡内的帮助将不胜感激。
结果
课程
class SpeechBubbleNode: SCNNode {
private let textNode = TextNode()
var string: String? {
didSet {
textNode.string = string
}
}
override init() {
super.init()
// Speech Bubble
let plane = SCNPlane(width: 200.0, height: 100.0)
plane.cornerRadius = 4.0
plane.firstMaterial?.isDoubleSided = true
geometry = plane
// Text Node
textNode.position = SCNVector3(position.x, position.y, position.z + 1.0)
// textNode.position = convertPosition(SCNVector3(0.0, 0.0, 1.0), to: textNode)
// textNode.position = SCNVector3(0.0, 0.0, position.z + 1.0)
addChildNode(textNode)
}
required init?(coder …Run Code Online (Sandbox Code Playgroud)