我一直在尝试使用场景工具包创建一个场景,其中指定的对象始终位于其他对象的前面,尽管事实上它实际上位于其他对象的后面.与搅拌机中使用的效果类似.
显然,blender使用GUI和大量数学来转换2D对象,但我需要在具有SCNGeometry的SCNNode中使用此效果,换句话说,当前位于场景中的3D对象.
我考虑使用类别掩码,但在阅读Apple的文档后,我意识到这对我正在寻找的效果不起作用.
有没有人知道在SceneKit中做这个的方法?或者更好的是,甚至可以这样做吗?
非常感谢大家,现在以及我从StackExchange获得的所有其他帮助!
我试图用点击手势突出显示SceneKit中的选定节点.不幸的是,我无法完成它.我能做的最好的事情是在点击节点时更改材料.
let material = key.geometry!.firstMaterial!
material.emission.contents = UIColor.blackColor()
Run Code Online (Sandbox Code Playgroud)
有人可以提出一种方法,我可以只是在对象周围添加边框或轮廓而不是改变整个节点的颜色?
我是新来的SceneKit和三维物体.我一直在做一些研究,但我没有找到我的问题的答案.
我需要在水平方向上显示多个3D对象UICollectionView,每个单元格中有一个.我希望它们对齐并且大小相同,所以我希望它们适合父视图,也就是说SCNView.
用于描绘场景的图像:
我希望3D对象的边界在视觉上与SCNView的边界匹配.我希望3D对象在视图中"适合",有点像UIViewContentMode.scaleAspectFit.
到目前为止,这是我的代码:
let scene=SCNScene(named: file_name)
let node=scene.rootNode.childNode(withName: node_name, recursively: true)!
node.scale=SCNVector3Make(28, 28, 28)
node.position=SCNVector3Make(0, 0.05, -0.5)
scene.rootNode.addChildNode(node)
sceneview.scene=scene
Run Code Online (Sandbox Code Playgroud) 我尝试在ARKit应用程序中从服务器URL加载动态.scn和纹理文件.我已经通过这种 方式从web url上实现了加载.scn文件..但是在运行后我没有在设备上看到任何纹理.我收到以下错误消息.
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d42e1980 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_DIFFUSE.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d00fe800 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_NORMAL.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d40ff800 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_METALLIC.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d42e0d80 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_ROUGHNESS.png [0.000000x0.000000]>
ARKitExample[3016:995067] [SceneKit] Error: Failed loading : <C3DImage 0x1d02e2e00 src:file:///var/containers/Bundle/Application/622ACF79-2318-4953-A9AE-9A7F2B453AFB/ARKitExample.app/textures/lamp_SHADOW.png [0.000000x0.000000]>
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题.谢谢
@ Xartec我已经尝试过你提到的方式,但我没有得到任何回复.我怎么能解决它?
let urlString = "\("https://d533c2fd.ngrok.io/")\("mode")"
let url = URL.init(string: urlString)
let request = URLRequest(url: url!)
let session = URLSession.shared
let downloadTask = session.downloadTask(with: request, …Run Code Online (Sandbox Code Playgroud) 我已经下载了苹果提供的 .usdz 模型:https : //developer.apple.com/arkit/gallery/
但是现在,我想用这些模型之一创建一个 SCNNode,所以我这样做是为了获取节点:
guard let urlPath = Bundle.main.url(forResource: "retrotv", withExtension: "usdz") else {
return
}
let mdlAsset = MDLAsset(url: urlPath)
let modelRootNode = SCNScene(mdlAsset: mdlAsset).rootNode
Run Code Online (Sandbox Code Playgroud)
然后我将它添加到场景中,结果是这样的:
为什么它没有纹理?
如您所见,我已将下载的 .usdz 文件放入我的项目目录中的文件夹中:
我正在使用SceneKit并拥有一个带有多个SCNNode的应用程序,当用户点击一个时,它将跟随他们的手指(使用UILongPressGestureRecognizer).在状态开始和更改,我使用以下代码行来更改节点的位置:
_currentlyMoving?.position = SCNVector3Make(worldPoint.x, worldPoint.y, worldPoint.z)
Run Code Online (Sandbox Code Playgroud)
在这一行中,_currentlyMoving是SCNNode,而worldPoint是我手指的位置.
这是将节点移动到正确的位置; 但是,它似乎也在将节点的旋转更改为(0,0,0)(节点始终处于其起始旋转位置.)
有没有办法在不影响旋转的情况下改变SCNNode的位置?
此外,我尝试了以下但它也没有工作(同样的事情发生):
_currentlyMoving?.transform.m41 = worldPoint.x
_currentlyMoving?.transform.m42 = worldPoint.y
_currentlyMoving?.transform.m43 = worldPoint.z
Run Code Online (Sandbox Code Playgroud)
我正在对节点做的唯一其他事情是以下三行来阻止它在拾取时移动:
_currentlyMoving?.physicsBody?.velocity = SCNVector3Make(0.0, 0.0, 0.0)
_currentlyMoving?.physicsBody?.velocityFactor = SCNVector3Make(0.0, 0.0, 0.0)
_currentlyMoving?.physicsBody?.angularVelocity = SCNVector4Make(0.0, 0.0, 0.0, 1.0)
Run Code Online (Sandbox Code Playgroud) 我已经创建了一个玩家可以移动的SceneKit 3D迷宫世界.像跳跃这样的一些动作涉及在几秒钟的时间段内改变观察方向时上下移动相机.在此期间,我想忽略用户的轻击和滑动,这通常会导致其他类型的动作,如转弯和前进.
我可以创建一个匹配跳转持续时间的计时器并设置Bool,但我希望能够以更简单的方式检查摄像机的SCNNode.
有没有一种简单的方法来查看相机的SCNNode是否不再运行SCNAction跳转,所以我可以在其他点按和滑动操作之前添加此逻辑?
或者也许有一个SCNAction可以设置我可以在跳转序列的开始和结束时放置的Bool?
这是我的跳转代码:
let jumpUp: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), jumpHeight), duration: jumpTime)
let jumpAppex: SCNAction = SCNAction.wait(duration: jumpWaitTime)
let fallDown: SCNAction = SCNAction.move(to: SCNVector3Make(Float(Int(-yPos)), Float(Int(xPos)), cameraHeight), duration: jumpTime)
var lookDown: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(?), duration: jumpTurnTime)
let noLook: SCNAction = SCNAction.wait(duration: jumpTime*2.0)
var lookBack: SCNAction = SCNAction.rotateTo(x: 0, y: 0, z: 0, duration: jumpTurnTime)
switch playerDirection.direction
{
case .south:
lookDown = SCNAction.rotateTo(x: 0, y: 0, z: CGFloat(southZ), duration: jumpTurnTime)
lookBack = SCNAction.rotateTo(x: …Run Code Online (Sandbox Code Playgroud) 因此,要明确我的目标,因为我没有要共享的代码...假设我有一个SCNNode,它位于摄像机和另一个SCNNode之间。第一个SCNNode是一个SCNBox,但是没有纹理,因此可以在它后面看到第二个SCNNode。我想为第一个节点提供透明材料,但也要使它后面的所有节点都遮住,好像它是不透明的一样。在常规场景中,这意味着您可能会看到场景背景颜色,也许是黑色,但是我正计划在ARKit中进行此操作,这更有意义,因为这意味着您将仅看到其背后的真实世界。
下面的代码将SCNPlane放置到触摸点上,但是平面朝向(旋转)到应用程序启动时手机所处的位置.理想情况下,我希望将节点定位到物理墙或相机的当前方向.如何用ARKit完成?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else {return}
let result = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint])
guard let hitResult = result.last else {return}
let hitTransform = SCNMatrix4.init(hitResult.worldTransform)
let hitVector = SCNVector3Make(hitTransform.m41, hitTransform.m42, hitTransform.m43)
createPlane(position: hitVector)
}
func createPlane(position: SCNVector3) {
let background = SCNNode()
background.geometry = SCNPlane.init(width: 0.12, height: 0.10) // better set its size
background.geometry?.firstMaterial?.diffuse.contents = "odinBW2.jpeg"
background.position = position
sceneView.scene.rootNode.addChildNode(background)
}
Run Code Online (Sandbox Code Playgroud) 现在我能够SCNPlane在检测到卡片时显示不同的内容.显示后SCNPlanes,用户触摸任何平面以显示新的SCNPlane.但是现在触摸工作正常但新SCNPlane的没有显示.
这是我尝试过的代码:
var cake_1_PlaneNode : SCNNode? = nil
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
if let imageName = imageAnchor.referenceImage.name {
print(imageName)
if imageName == "menu" {
// Check To See The Detected Size Of Our menu Card (Should By 5cm*3cm)
let menuCardWidth = imageAnchor.referenceImage.physicalSize.width
let menuCardHeight = imageAnchor.referenceImage.physicalSize.height
print(
"""
We Have Detected menu Card With …Run Code Online (Sandbox Code Playgroud)