我注意到如果你有一个空场景,然后用基于物理的光照加载3D模型,那么当对象出现时会有一点点凹凸不平.如果我之后添加一个不同的对象,那就不会发生口吃.
查看分析器,看起来默认的PBR着色器正在第一个慢帧中进行编译.是否可以预编译这些着色器,以便在我第一次渲染模型时不会发生这种情况?
类似的问题已经在其他框架中提出,比如Three.js.似乎是一个聪明的事情要防止.
我正在试图弄清楚如何将.dae带动画的文件导入Xcode和SceneKit.
它有点工作,但它真的很麻烦,我无法预览文件,Xcode有时会在尝试预览.daeXcode中的文件时崩溃.
.dae文件,然后在Xcode文件列表中选择该文件进行预览.结果如下所示.我已经完全缩放以确保我不仅仅是从网格内部查看模型.线条看起来像infinetly延伸.<animation>带有相应结束标记的标记,然后将其导入Xcode,它将根本不会打开.见下图..dae文件版本未使用ConvertToXcodeCollada转换,并且添加.dae文件作为.scn场景文件中的子参考,则模型会正确显示,并且动画正在播放.图片如下.我还尝试将动画模型导入Blender,然后从那里将其导出到Collada(youtube上的教程中的非结构),以及相同的结果.有没有办法我能以正确的方式做到这一点,它的工作方式应该如此,没有Xcode表现出错误?如果我能.dae直接预览和编辑文件的材料等会更容易,而不必总是将它们添加到现有的.scnScene Kit场景中.
作为一个主要的高级/ iOS开发者,我有兴趣将SceneKit用于动画项目.
几个月来我一直在玩SceneKit,尽管它显然是为"实时"互动设计的,但我觉得能够将SKScene"呈现"为视频非常有用.目前,我一直在使用Quicktime的屏幕录像机来捕获视频输出,但(当然)帧速率会下降.是否有一种替代方案可以按照自己的节奏渲染场景并输出为流畅的视频文件?
我明白这是不可能的......只是想我会问,以防我错过了一些低级别的东西!
I am applying a force and a torque on an node. This is my code:
myNode?.physicsBody?.applyForce(SCNVector3Make(0, -6, 4), atPosition: SCNVector3Make(0, 1, -1), impulse: true)
myNode?.physicsBody?.applyForce(SCNVector3Make(0, -2, 10), impulse: true)
myNode?.physicsBody?.applyTorque(SCNVector4Make(4, 2, 2.5, 1.6), impulse: true)
Run Code Online (Sandbox Code Playgroud)
该物体现在倒下并随后从左向右移动.我希望它从右向左移动(基本上反映了第一次移动穿过y轴).我发现我对前两行代码的处理很少,因为力没有x分量.最后一行applyTorque是我需要操纵的那一行.如果矢量有4个分量,你如何在y轴上绘图?我对数学有点生疏
我在XCode中导入了一个DAE文件并将其转换为SCN文件.此文件包含一些带动画的3D对象.
我正在尝试使用动画导入所有节点并在场景中播放它们.节点已导入但我无法播放动画.
NSURL *idleURL = [[NSBundle mainBundle] URLForResource:model.model3D
withExtension:@"scn" subdirectory:@"3d.scnassets"];
SCNScene *idleScene = [SCNScene sceneWithURL:idleURL
options:@{
SCNSceneSourceAnimationImportPolicyKey:SCNSceneSourceAnimationImportPolicyPlayRepeatedly}
error:nil];
// Merge the loaded scene into our main scene in order to
// place the object in our own scene
for (SCNNode *child in idleScene.rootNode.childNodes){
[_sceneView.scene.rootNode addChildNode:child];
if (child.animationKeys.count > 0) {
CAAnimation *animation = [child animationForKey:child.animationKeys[0]];
animation.repeatCount = INFINITY;
child.paused = NO;
[_sceneView.scene.rootNode addAnimation:animation forKey:child.animationKeys[0]];
}
}
[_sceneView setPlaying:YES];
Run Code Online (Sandbox Code Playgroud) 我正在尝试将SKScene设置为ARSCNView内的SCNPlane中的内容.现在,SKScene是一个非常简单的,在.sks文件中定义,只包含红色背景和中心的绿色矩形.这里是代码:第一个函数在用户点击屏幕时在摄像机前面创建一个ARAnchor,另一个函数为锚点创建SCNNode.
当我将飞机的firstMaterial内容设置为skScene时,我遇到了崩溃:validateDepthStencilState:3671:断言失败`MTLDepthStencilDescriptor使用frontFaceStencil但MTLRenderPassDescriptor有一个nil stencilAttachment纹理'
这只发生在附加设备的XCode上运行应用程序.如果我拔掉它并直接从设备运行应用程序,我会正确看到内容,我可以添加大量那些丑陋的飞机(截图在底部)
@objc func addAnchor() {
if let currentFrame = sceneView.session.currentFrame {
var translation = matrix_identity_float4x4
translation.columns.3.z = -1.0
let transform = simd_mul(currentFrame.camera.transform, translation)
// Add a new anchor to the session
let anchor = ARAnchor(transform: transform)
sceneView.session.add(anchor: anchor)
}
}
// Override to create and configure nodes for anchors added to the view's session.
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
guard let skScene = SKScene(fileNamed: "MyScene") else {
print("Could not load skscene!") …Run Code Online (Sandbox Code Playgroud) 我正在使用iOS 11(for ARKit),虽然许多人指出SceneKit来自Apple 的示例应用程序与Fox,我在该示例项目(文件)中使用的扩展程序有问题,以添加动画:
extension CAAnimation {
class func animationWithSceneNamed(_ name: String) -> CAAnimation? {
var animation: CAAnimation?
if let scene = SCNScene(named: name) {
scene.rootNode.enumerateChildNodes({ (child, stop) in
if child.animationKeys.count > 0 {
animation = child.animation(forKey: child.animationKeys.first!)
stop.initialize(to: true)
}
})
}
return animation
}
}
Run Code Online (Sandbox Code Playgroud)
看来这个扩展非常方便,但我不确定如何迁移它现在它已被弃用?它SceneKit现在是默认内置的吗?
该文档并未真正显示有关其被弃用的原因或从何处开始的详细信息.
谢谢
我正在尝试模拟足球比赛.我有一个SCNPlane模拟法庭.我已经导入了足球目标3D模型(.dae文件)和球模型(.dae).
我的球有一个动态的物理体,飞机静止,目标是运动学.我为每个SCNNode 设置了categoryBitMask和contactTestBitMask.
当我将球射向球门时,有时球会反弹并且表现得如预期的那样,但有时候球会穿过球门并穿过它.
我已经分配了SCNPhysicsContactDelegate并且didBeginContact当球再次反弹时触发,但是当球越过它时,则不调用该方法.
你知道会发生什么吗?
谢谢!
我正在尝试开发一个基本游戏,我有一个场景,其中有几个子节点添加到根节点.每个节点都有两个名称之一,friend或者enemy.
如果用户触摸其中一个enemy节点,我想删除所有已命名的子节点enemy.
我尝试过几件事,但似乎无法正常工作.
在我的touchesBegan功能:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first!
let location = touch.location(in: gameView)
let hitList = gameView.hitTest(location, options: nil)
if let hitObject = hitList.first {
let node = hitObject.node
//This doesn't work
gameScene.rootNode.childNodes(passingTest: { (node, UnsafeMutablePointer<ObjCBool>) -> Bool in
node.removeFromParentNode()
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用,gameScene.rootNode.enumerateChildNodes(withName:)但我也无法使用.
我可以得到的是,如果我在那里做类似的事情:
if node.name == "enemy" {
node.removeFromParentNode()
}
Run Code Online (Sandbox Code Playgroud)
但是,这只会删除被击中的单个节点,而不是所有节点.如何在Swift with Scene Kit中获取具有特定名称的所有子节点?