Tag: 场景包

SceneKit – 线程 – 在哪个线程上做什么?

使用SceneKit时,更新方法: func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) 是不是在主要的调用,但在其他线程。 我应该在主线程上做什么,在这个“SceneKit线程”上做什么? 我应该在哪里添加新的节点/几何? 修改这些对象的位置等是安全的吗?

将图像转换为SceneKit节点

我有一个位图图像: (但是,这应该与任何任意图像工作) 我想把我的形象,并使其成为一个3D SCNNode。 这个代码我已经完成了很多。 这需要图像中的每个像素,并创build一个具有SCNBox几何的SCNNode。 static inline SCNNode* NodeFromSprite(const UIImage* image) { SCNNode *node = [SCNNode node]; CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); const UInt8* data = CFDataGetBytePtr(pixelData); for (int x = 0; x < image.size.width; x++) { for (int y = 0; y < image.size.height; y++) { int pixelInfo = ((image.size.width * y) + x) […]

使用swift的场景工具包内存pipe理

我很困惑,我是如何使用swift释放场景中的内存。 每当我从collada文件创build一个SCNNode,它会导入几何体,创build一个物理对象,并从一个jpg文件设置一个材质。 由于某些原因(即使文件大小在300k以下)创build一个新的对象时,这占用了10MB的RAM,但无论如何。 每当它从父节点中删除,零内存释放,我不明白为什么。 我可以使用哪些代码来真正删除对象? 我找不到关于这个问题的任何文件。 这只是一个普遍的问题,所以在这里不需要代码。

在SceneKit中使用着色器修改器对纹理进行animation处理会导致长时间的抖动纹理

我正在为iOS的SceneKit写一个场景。 我正在尝试使用精灵表应用纹理到一个对象。 我用这个代码遍历该表中的图像: happyMaterial = [SCNMaterial new]; happyMaterial.diffuse.contents = happyImage; happyMaterial.diffuse.wrapS = SCNWrapModeRepeat; happyMaterial.diffuse.wrapT = SCNWrapModeRepeat; happyMaterial.shaderModifiers = @{ SCNShaderModifierEntryPointGeometry : @"_geometry.texcoords[0] = vec2((_geometry.texcoords[0].x+floor(u_time*30.0))/10.0, (_geometry.texcoords[0].y+floor(u_time*30.0/10.0))/7.0);" }; 一切都很好。 除了随着时间的推移,纹理开始变得随机抖动,特别是沿着x轴。 有人提到这可能是因为“浮点精度问题”,但我不知道如何诊断或修复这个问题。 另外:我不知道如何logging来自着色器代码的数据。 能够查看诸如“u_time”之类的variables并查看到底发生了什么真是太棒了。

圆球上的两个点之间的圆柱方向,Scenekit,四元数IOS

我一直在使用SceneKit在球体的外边缘上的两点之间画一个圆柱体。 我已经使用原始几何和使用SCNRendering Delegate的openGL在这两点之间产生了一条界线,但是现在我需要在这两个点之间产生一个圆柱(好吧,不只是两个,而是任意两个坐在球表面上的3Dvector)。 我已经为此工作了大约3天了,而且我已经完成了四元数的实现,但是现在我无法实现。 学术文章,科学研究,什么也没有,没有什么工作是在两个固定点之间重新排列一个圆柱体。 我需要一个algorithm来做到这一点。 无论如何,这是我最近的代码不起作用,但是这只是我已经完成的近2千行代码的一小段代码,没有预期的结果。 我知道我可以移动到更高级的东西,比如构build我自己的SCNProgram和/或SCNRenderer,然后访问GLSL,OpenGL和Metal复杂性,但是这似乎是应该可以使用Scenekit和GLKit向量结构之间的转换和从SCNVector结构,但到目前为止,这是不可能的: 码: 以下代码获取经度和纬度坐标并将其投影到3D球体的表面上。 这些坐标是通过一个专有函数返回的,我在这里构build了一个在我的3D球体上精确显示的{x,y,z}坐标的SCNVector3。 我在两组经度和纬度坐标之间绘制一条线,用原始线绘制线条穿过球体的中心。 所以,正如我上面提到的,我想要这个function,但是用圆柱体,而不是线(顺便提一下,这里列出的经度和纬度坐标是假的,它们是随机生成的,但都落在地球表面上)。 drawLine = [self lat1:37.76830 lon1:-30.40096 height1:tall lat2:3.97620 lon2:63.73095 height2:tall]; float cylHeight = GLKVector3Distance(SCNVector3ToGLKVector3(cooridnateSetOne.position), SCNVector3ToGLKVector3(coordinateSetTwo.position)); SCNCylinder * cylTest = [SCNCylinder cylinderWithRadius:0.2 height:cylHeight]; SCNNode * test = [SCNNode nodeWithGeometry:cylTest]; SCNMaterial *material = [SCNMaterial material]; [[material diffuse] setContents:[SKColor whiteColor]]; material.diffuse.intensity = 60; material.emission.contents = [SKColor […]

SceneKit – 绘制3D抛物线

我得到三分,需要画一个平滑的三维抛物线。 麻烦的是,曲线是波涛汹涌,并有一些奇怪的麻烦在里面 这是我的代码… func drawJump(jump: Jump){ let halfDistance = jump.distance.floatValue/2 as Float let tup = CalcParabolaValues(0.0, y1: 0.0, x2: halfDistance, y2: jump.height.floatValue, x3: jump.distance.floatValue, y3: 0) println("tuple \tup") var currentX = 0 as Float var increment = jump.distance.floatValue / Float(50) while currentX < jump.distance.floatValue – increment { let x1 = Float(currentX) let x2 = Float((currentX+increment)) […]

如何将Wavefront OBJ文件转换为具有模型I / O的SCNNode

我已经从URL导入了一个Wavefront OBJ文件,现在我想将其插入我的iOS 9应用程序(在Swift中)的场景(SceneKit)中。 我到目前为止所做的是: let asset = MDLAsset(URL: localFileUrl) print("count = \(asset.count)") // 1 任何帮助转换这个SCNNode将不胜感激。 根据苹果的文档: 模型I / O可以与MetalKit,GLKit和SceneKit框架共享数据缓冲区,以帮助您有效地加载,处理和渲染3D资源。 但我不知道如何从MDLAsset缓冲区到SCNNode。

将SceneKit场景渲染为video输出

作为主要的高级/ iOS开发人员,我对使用SceneKit进行animation项目感兴趣。 我已经在SceneKit上玩了好几个月了,尽pipe它明显是为了“实时”交互而devise的,但是我觉得能够将SKScene渲染成video是非常有用的。 目前,我一直使用Quicktime的屏幕录像机捕捉video输出,但是(当然)帧速率下降。 有没有一种方法可以让场景按照自己的速度渲染并作为stream畅的video文件输出? 我知道这是不太可能的……只是想我会问,如果我错过了一些较低级别的东西!