为什么SCNNode .flattenedClone()不是崩溃就是让性能变差?
我正在尝试将大约4.5k SCNNode对象添加到场景中.它们的几何形状是两个SCNPlane s之一,其材料由CALayer s呈现(但我认为这不重要,CALayerDelegate s仅被调用一次,所以这似乎不是一个问题.)性能很糟糕( 使用.showsStatistics启用,我看到我在做几乎3.5k的绘制呼叫,这是我的问题,根据 2017年的WWDC视频.因此,如建议的那样,我将所有节点添加到一个父节点中,然后在其中添加.flattenedClone(),然后再将其添加到场景的根节点中.这给我带来了图形损坏和控制台上的重复错误: 2019-08-28 14:50:39.122937+0200 Breadboard[867:53252] [SceneKit] Error: C3DProgramHashCodeStoreRegisterProgramForRendererElement - index out of capacity (8192 > 8192) (" x>
0 2023-05-24
编程技术问答社区
Scenekit-在场景中添加新的SCNNODE会导致严重的滞后
我发现在场景中添加scnnodes(带有scnpeemementry)会导致严重的滞后尖峰. 根据时间分析器必须生成几何形状(至少将功能/方法称为这样).在将节点添加到场景时,而不是创建节点时,它可以做到这一点.因此,用scnnodes创建池将不起作用. 有没有办法摆脱这一滞后?我希望能够在场景中添加节点而不会掉落任何FPS. 到目前为止,我唯一的想法就是将所有内容都添加到场景中,然后将其隐藏/放置,尽管这并不是一个真正的解决方案. 这是时间分析器的镜头: 解决方案 看起来您正在添加一个带有SCNShape或SCNText的节点,并且这些几何形状很昂贵(您必须离散化和三角剖分bézier曲线,最终必须计算和倒角的偏移曲线). 您可以尝试从SCNSceneRenderer:-prepareObject:shouldAbortBlock:,-prepareObjects:withCompletionHandler: 预订以下方法
0 2023-05-23
编程技术问答社区
Swift中的子类Scnscene-覆盖init
我在Xcode 6中使用Swift遇到了一些编译器错误,我很难将头缠住.我正在尝试通过将scnscene进行划分来创建场景,但请继续在初始评估中遇到错误.我的代码的基本结构是: class SpaceScene: SCNScene { override init(named: String) { super.init(named: named) } } 这会导致第2行中的错误,并带有消息"初始化器不会覆盖其超级类别指定的初始化器",尽管SCNScene显然具有这样的初始评估器.我认为我缺少一些基本的东西 - 任何见解? 解决方案 在XCode 6.1上,以下要做: class SpaceScene : SCNScene { override init() { super.init() } required init(coder aDecoder: NSCoder) { super.init(coder: aDec
14 2023-05-15
编程技术问答社区
用高像素纹理优化SceneKit性能
我是一个经验丰富的iOS开发人员,但是Scenekit Newbie总共试图在基本应用中模拟某些行星. 到此为止,我使用的是施加在基本球体上的火星,金星等的高分辨率正常和散射地图.他们工作!他们看起来很棒,正是我想要的. 问题是,我因质量/内存权衡而被杀死. 我可以缩小纹理的尺寸以减少内存足迹,但是在一定分辨率下,结果(尤其是正常地图)开始看起来确实很糊状和可怕.该应用需要能够至少缩小地球的屏幕宽度的位置,但是要保持山区和山谷中的任何脆皮,我需要在约6000 x 3000处使用PNG普通地图(上图).我可以缩放扩散地图向下降低到约1000 x 500,但即使如此,我会从一个球体上轻轻旋转,带有单个光,没有背景,没有物理和没有其他几何形状. 现在,我知道这是一张超高分辨率的普通图.我得到它.但与此同时,这只是一个球,什么也不做.这甚至与我看到其他应用程序的某些复杂性甚至没有完美地执行,即使有一些非常详细的纹理.似乎必须有某种方法可以在不崩溃的情况下获得一个对单个对象
0 2023-05-15
编程技术问答社区
Scenekit通过立方体测试的表现
在学习游戏的3D图形编程时,我决定通过使用场景套件3D API开始简单.我的第一个游戏目标是建立一个非常简化的Minecraft.一个只有立方体的游戏 - 它会多么困难. 下面是我写的一个循环,要放置100 x 100立方体(10,000)的骑行,而FPS性能是糟糕的(〜20 fps).我最初的游戏目标对于场景套件而言太多了,还是有更好的方法来解决这个目标? 我已经阅读了有关stackexchange的其他主题,但不要觉得他们回答了我的问题.将裸露的表面块转换为单个网格无法正常工作,因为SCNSEMETER是不可变的. func createBoxArray(scene : SCNScene, lengthCount: Int, depthCount: Int) { let startX : CGFloat = -(CGFloat(lengthCount) * CUBE_SIZE) + (CGFloat(lengthCount) * CUBE_MARGIN) /
4 2023-05-12
编程技术问答社区
不影响SCNFloor的SCNProgram
在我使用着色器修饰符的实验中,我看到数组数据无法传输到着色器. scenekit在OpenGL着色器中将数组数据传递给统一数组时给出缓冲区尺寸错误 因此,我决定尝试SCNPROGRAM.但是现在我意识到我使用SCNProgram添加的着色器不起作用. 这个问题有特殊原因吗? 我用于测试的超级简单着色器; 顶点着色器 precision highp float; attribute vec3 vertex; uniform mat4 ModelViewProjectionMatrix; void main() { gl_Position = ModelViewProjectionMatrix * vec4(vertex, 1.0); } 碎片着色器 precision mediump float; void main( void ) { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
0 2023-05-11
编程技术问答社区
是否可以将Float数组传递到iOS SceneKit顶点着色器修饰符?
我正在与iOS上的Scenekit合作.在OpenGL ES Vertex着色器中,我正在尝试阅读以下制服: uniform float floats[8]; 我将阵列传递到Vertex着色器修饰符,使用以下调用Swift: let floats = [10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0] material.setValue(NSArray(array: floats), forKey: "floats") 然而,无论我做什么,似乎制服都只是将其初始化为零. 将阵列传递给支持的着色器修饰符?如果是这样,什么是正确的语法? 解决方案 否,不支持将NSArray传递给制服,基于 但是您可以使用两个vec4 (SCNVector4)或mat4 (CATransform3D),但请记住将它们包裹在NSValue中. 另一种方法是尝试这样的事情: let vec1 = SCNVector4
6 2023-05-11
编程技术问答社区
SceneKit-移除边缘边框的缝合线
我正在在立方体上显示纹理(请参阅 scenekit-盒子) 现在情况正常,但是结果显示了我在这里概述的一些立方体面之间的轻缝线(您在立方体内): 知道我怎么能摆脱它?输入纹理看起来像 因此,输入中存在一些不连续性.我正在使用自定义的场景几何形状,该几何图形除以将此纹理映射到立方体所做的不多.您可以找到上面提到的相关代码: https://stackoverflow.com/a/38961244/2054629 P> 解决方案 作为一种骇客解决方案,我将立方体的几何形状更改为略有立方体,更像是 使边缘消失(假设相机在内部).结果是裁剪了一点,但这并不那么明显. 我用来将3 x 8顶点的位置定义为: let _positions = [ SCNVector3(x:-halfSide, y:-halfSide, z: halfSide), SCNVector3(x: halfSide, y:-halfSide, z: halfSide), SC
10 2023-05-11
编程技术问答社区
SceneKit中的自定义顶点属性
我正在使用Scenekit生成一些自定义几何形状.这很好,但是我正在努力寻找一种包含自定义顶点属性的方法.具体来说,我希望每个顶点包括一个额外的scnvector3. 我找到了很多示例,这些示例利用shadermodifiers包含依赖custom striber striber 值的GLSL/金属代码. Scenekit是否可以,还是我的思考倒退? 解决方案 似乎没有一种方法可以访问着色器修饰符中的自定义几何源.也就是说,如果您的数据符合float4,则可以通过SCNGeometrySourceSemanticColor. 传递该数据. fox 示例代码使用相同的示例代码动画草叶片的技术.如下图所示,位移量烘烤成灰度顶点颜色. 最后,以下着色器修饰符读取_geometry.color的值,并确保将其重置为纯白色,以使存储的数据不会影响对象的最终颜色. float offset = _geometry.color.x * (sin(1.2 * u_time
2 2023-05-11
编程技术问答社区
SceneKit-将立方体纹理映射到盒子上
我有一个看起来像 的立方体的纹理 我想在场景视图中在立方体上使用它.我正在使用SceneEkit几何SCNBox.不幸的是,结果是纹理完全投影在每个脸上,而不是仅使用相应的部分: let videoGeometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0) videoGeometry.firstMaterial?.isDoubleSided = true videoGeometry.firstMaterial?.diffuse.contents = UIImage(named: "test")! 我知道我可以在几何形状上使用着色器修饰符,但我不确定从哪里开始.由于目前使用纹理六次,我的直觉是SCNBox几何可能不适合我的目标,但我真的不知道如何更改它. 解决方案 您可以将其与自定义几何形状一起使用:创建一个立方体( http://rronnqvi.st/custom-scenekit-g
0 2023-05-11
编程技术问答社区
通过Swift设置ARKit方向
我正在开发带有OpenGL的Arkit应用程序,因此直接与Arkit合作而不是使用Scenekit. 默认情况下,Arkit设置为景观取向,但是我无法跟踪任何文档或示例以旋转以肖像. SceneKit示例在肖像中起作用,但Metal示例仅在景观中起作用. 是否可以更改ARKIT跟踪方向? 解决方案 我能够通过将相机矩阵乘以基于设备方向旋转的四元素来解决应用程序逻辑. 其他解决方案 let cameraQuaternion = simd_quatf(arCameraTransform) minimapcamera.quaternion2 = cameraQuaternion * simd_quatf(angle: Float.pi/2, axis: SIMD3(0, 0, 1)) 我的解决方案基于肖像的接受答案 其他解决方案 对不起,Objective-C. 查找并重写此 uniforms->viewMat
2 2023-05-11
编程技术问答社区
将屏幕外的scnsene渲染到UIImage中
如何将 SCNScene渲染到UIImage? 我知道SCNView提供了-snapshot方法,但不幸的是,这对屏幕外视图不起作用. a 类似的问题答案暗示使用glReadPixels读取来自OpenGL的位图数据,但是该方法在我的屏幕外场景中对我不起作用. 我尝试使用SCNRenderer SCNRenderer渲染到GLKView的上下文中. 解决方案 swift 4与scnrenderer: 您可以使用 scnrenderer 的快照方法将屏幕外的scnscene渲染到uiimage. 这里有一些警告,这使用了金属.我不知道设备/iOS版本截止位置在哪里,但是您需要一个较新的设备.您也将无法在模拟器上运行它. 步骤1-像平常一样设置场景: // Set up your scene which won't be displayed let hiddenScene = SCNScene() [insert code to set up yo
0 2023-05-10
编程技术问答社区
SceneKit-Crossfade材质属性纹理
SCNMaterialProperty.contents 指出它是一种动画属性,实际上我可以在两种颜色之间执行交叉表.但是我无法在两个图像之间交叉. 所以我开始怀疑这是否完全可以,或者我是否需要为此创建自定义着色器? 我已经尝试了一个隐式动画,在这种情况下,它立即显示了"后"图像: node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"before"]; [SCNTransaction begin]; [SCNTransaction setAnimationDuration:5]; node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"after"]; [SCNTransaction commit]; 明确的动画,什么都不做: CABasicAnimation *animation = [CAB
2 2023-05-10
编程技术问答社区
自定义着色器 SCNProgram iOS 9 Scenekit
我试图在SceneKit中四处乱逛,并自学.基本上,我正在创建一个带有3个矩形侧面和1个倾斜幻灯片的四边形. 我希望我的纹理在整个表面上伸展和扭曲/变形. 在线阅读一些东西,看来我需要用自定义的顶点和碎片着色器制作SCNProgram才能获得效果.但是,我似乎无法获得质地散布在整个表面上.需要帮助. (我是图形编程的新手,因此试图向自己教它). 我的快速代码以创建几何形状和纹理,如下所示: func geometryCreate() -> SCNNode { let verticesPosition = [ SCNVector3Make(0.0, 0.0, 0.0), SCNVector3Make(5.0, 0.0, 0.0), SCNVector3Make(5.0, 5.0, 0.0), SCNVector3Make(0.0, 3.0, 0.0) ]
0 2023-05-10
编程技术问答社区
如何从ARKit录制视频?
现在我正在测试ARKIT/SCEENEKIT实现. 屏幕上的基本渲染有点可行,因此我想尝试将我在屏幕上看到的内容录制到视频中. 仅用于录制场景套件,我找到了 // // ViewController.swift // SceneKitToVideo // // Created by Lacy Rhoades on 11/29/16. // Copyright © 2016 Lacy Rhoades. All rights reserved. // import SceneKit import GPUImage import Photos class ViewController: UIViewController { // Renders a scene (and shows it on the screen) var scnView: SCNView! // Another renderer var secondaryRender
0 2023-05-10
编程技术问答社区
使用纹理坐标在纹理上绘制SceneKit
我有一个加载到Scenekit的Collada模型.当我在模型上执行hittest时,我能够检索命中的模型的纹理坐标. 使用这些纹理坐标,我应该能够用颜色代替纹理坐标. 因此,这样我应该能够借鉴模型 如果到目前为止我错了,请纠正我. 到目前为止,我读了很多文章,但我只是不正确. (尽管我确实得到了一些时髦的效果; - ) 我的顶点着色器: precision highp float; attribute vec4 position; attribute vec2 textureCoordinate; attribute vec2 aTexureCoordForColor; //coordinates from the hittest uniform mat4 modelViewProjection; varying vec2 aTexureCoordForColorVarying; // passing to the fragment shader h
0 2023-05-10
编程技术问答社区
球体上两点之间的圆柱体方向, Scenekit, Quaternions IOS
我一直在尝试使用Scenekit在球体外边缘的两个点之间绘制一个圆柱体.我已经使用原始几何形状和SCNRendering代表在这两个点之间产生了一条线,但是现在我需要在这两个之间产生一个圆柱体(不仅是两个,而是任何两个位于球体表面上的两个3D向量).我已经连续进行了大约3天的工作,并且经历了我在实施四局实现这一目标时能找到的一切,但是就目前而言,我无法正常工作.学术文章,科学研究等,什么都没有努力在两个固定点之间重新调整圆柱体.我需要一个算法来执行此操作. 无论如何,这是我最近无效的代码,但这只是我到目前为止使用的近2K代码的一小部分,没有预期的结果.我知道我可以转向更先进的东西,例如构建自己的scnprogram和/或scnrenderer,以访问GLSL,OpenGL和金属复杂性,但这似乎是可以使用Scenekit并在ScnVector之间进行转换的某些东西结构,但到目前为止是不可能的: 代码: 以下代码摄入经度和纬度坐标并将其投射到3D球体的表面上.这些坐标是通过
4 2023-05-10
编程技术问答社区
在SceneKit中使用着色器修改器对纹理进行动画处理会导致纹理长时间抖动
我正在为iOS编写场景. 我正在尝试使用精灵表将纹理应用于对象.我用此代码迭代该表中的图像: 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);" };
0 2023-05-10
编程技术问答社区
对SceneKit中相机的正射投影感到困惑
我想使用拼字投影在我的应用中显示3D场景.在我的代码中,我在场景中放了一个盒子,并将视角的正拼图投影设置为打击. (0,0,500)的相机查看-Z方向,并在世界的起源中盒子.因此,相机应该能够捕获盒子. let cameraNode = SCNNode() let pov = SCNCamera() pov.usesOrthographicProjection = true let width = UISreen.main.bounds.size.width let glMat = GLKMatrix4MakeOrtho(-width/2, width/2, -width/2, width/2, 1, 1000) pov.projectionTransform = SCNMatrix4FromGLKMatrix4(glMat) cameraNode.camera = pov cameraNode.position = SCNVector3.init(0, 0, 500) scene
6 2023-05-10
编程技术问答社区
是否有办法在场景套件中添加一个轮廓?
我一直在场景套件中制作游戏,但是很难看到对象的边缘,使某些游戏细节无法看到.有没有办法在所有游戏对象上制作黑色大纲? 解决方案 您可以使用另一个答案中提到的SCNTechnique(您可以查看有关 cel shading ,具有边缘 - 检测通行证),但是全框后处理非常昂贵. 在OS X上,您还可以利用几何形状着色器(请参阅本文).但这在iOS上不可用,可能更难实施和正确. 我会采用一种更轻松的技术,这仅涉及顶点和碎片着色器.您可以看一下本文 - 使用SCNProgram或着色器修饰符在Scenekit中创建. 其他解决方案 有一个示例是为使用Scntechnique的节点制作发光轮廓: https://github.com/laanlabs/scntechniqueglow 您可以修改颜色和模糊方法以实现触发轮廓效果. 其他解决方案 另一个scntechnique示例,如下所述: https://www.nurfacegames.com/every
4 2023-05-10
编程技术问答社区