标签: scenekit

具有SceneKit线原始类型的笔画宽度

我正在尝试使用场景工具包复制此立方体图像形状(获得原始创建者的许可).

在此输入图像描述

到目前为止,我有线条和顶点的绘图代码.我无法使用图像,因为背景必须是透明的.

我正在尝试解决的具体问题是如何编辑SCNGeometryPrimitiveType.Line元素的笔触宽度.

我创建行的基本方法是这样的:

private func squareVertices(length: Float) -> [SCNVector3] {
    let m = length/Float(2)

    let topLeft =       SCNVector3Make(-m-q,  m+q, m+q)
    let topRight =      SCNVector3Make( m+q,  m+q, m+q)
    let bottomLeft =    SCNVector3Make(-m-q, -m-q, m+q)
    let bottomRight =   SCNVector3Make( m+q, -m-q, m+q)

    return [topLeft, topRight, bottomLeft, bottomRight]
}

private func cubeFace() -> SCNGeometry {

    let vertices : [SCNVector3] = squareVertices(l)
    let geoSrc = SCNGeometrySource(vertices: UnsafePointer<SCNVector3>(vertices), count: vertices.count)

    // index buffer
    let idx1 : [Int32] = [0, 3] …
Run Code Online (Sandbox Code Playgroud)

drawing ios scenekit swift scnnode

9
推荐指数
2
解决办法
6878
查看次数

将SCNGeometry渲染为线框

我在iOS上使用SceneKit,我想要渲染为线框的几何体.所以基本上我只想绘制线条,所以没有纹理.

我发现我可以使用shaderModifiersused 的属性SCNMaterial来实现这一点.着色器修改器的示例:

material.shaderModifiers = [
    SCNShaderModifierEntryPointFragment: "_output.color.rgb = vec3(1.0) - _output.color.rgb;"
]
Run Code Online (Sandbox Code Playgroud)

这个例子显然只是反转输出颜色.我对用于着色器片段的'GLSL'语言一无所知.

任何人都可以告诉我,我应该使用哪些代码作为着色器片段,仅在边缘附近绘制,以使几何看起来像线框?

或者可能还有一种将几何体渲染为线框的方法.我很乐意听到它.

shader fragment-shader ios scenekit

9
推荐指数
3
解决办法
4781
查看次数

SCNParticles最高效的图像格式?

我一直在使用带有Alpha的24位.png,来自Photoshop,只是尝试了一个与OpenGL ES配合得很好的.psd,但是Metal没有看到Alpha通道.

SceneKit中粒子绝对最高效的纹理格式是什么?

如果需要,这是一张要测试的表.

它看起来是白色的......右键单击并保存为空白区域.这是一套阿尔法重的戒指.如果你眯着眼睛看屏幕,你可能几乎不能把它们弄出来:

在此输入图像描述

夸张的示例用例:

https://www.dropbox.com/s/vu4dvfl0aj3f50o/circless.mov?dl=0

在此输入图像描述

//任何人的附加点都可以猜出视频中左右环之间的差异.

particles particle-system scenekit

9
推荐指数
1
解决办法
879
查看次数

Mapping a vector across the y-axis if it has 4 components

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轴上绘图?我对数学有点生疏

ios scenekit

9
推荐指数
2
解决办法
315
查看次数

将CALayer设置为SCNMaterial的漫反射内容

在过去的几天里,我一直在网上搜索无济于事.不幸的是,关于这个特定问题的苹果文档是模糊的,没有可用的示例代码(至少这是我发现的).您可能会问的问题似乎是什么......

我正在尝试将uiview的图层设置为用于渲染iPhone模型屏幕的材质内容(是的,幻觉:P).iPhone的屏幕UV映射设置为0到1,因此在将纹理/图层映射到纹素上时不会出现问题.

所以,不要让这个图层在iPhone上呈现,与左图像相同,相反,我将其渲染到iPhone上,就像右图一样

更正渲染不正确的渲染

在此输入图像描述

还要注意,当我设置一个断点并调试实际的iPhone节点并在Xcode中查看它时,会显示一个完全不同的渲染,当我继续执行时,该层会得到半固定:

奇怪的错误

现在......我如何解决这个问题??? 我尝试过使用漫反射内容变换矩阵,但没有任何修复.我也尝试将UIView调整为256x256(因为UV似乎是256x256,如blender所示 - 3d建模包),但这并没有解决任何问题.

这是图层的代码:

UIView *screen = [[UIView alloc] initWithFrame:self.view.bounds];
screen.backgroundColor = [UIColor redColor];

UIView *temp = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screen.bounds.size.width, 60)];
temp.backgroundColor = [UIColor colorWithRed:0 green:(112.f/255.f) blue:(235.f/255.f) alpha:1];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectInset(temp.bounds, 40, 0)];
label.frame = CGRectOffset(label.frame, 40, 0);
label.textColor = [UIColor colorWithRed:0 green:(48.f/255.f) blue:(84.f/255.f) alpha:1];
label.text = @"Select Track";
label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:30];
label.minimumScaleFactor = 0.001;
label.adjustsFontSizeToFitWidth = YES;
label.lineBreakMode = NSLineBreakByClipping;
[temp addSubview:label];

UIView *separator = [[UIView …
Run Code Online (Sandbox Code Playgroud)

objective-c calayer material ios scenekit

9
推荐指数
2
解决办法
1906
查看次数

ARKit vs SceneKit坐标

我试图理解在ArKit中引入的不同元素与它们在SceneKit中的等价物之间的区别:

  • SCNNode.simdTransformVS SCNNode.transform.在ARKit中,似乎人们使用SCNNode.simdTransform而不是SCNNode.transform.他们有什么不同?simdTransform似乎使用列主要顺序,而transform(SCNMatrix4)是行主要.如何将一个转换为另一个?只需转置?我的印象是,如果我使用transform而不是跟踪,那么跟踪也不会有效simdTransform.这是预期的还是仅仅是一种印象?如果我设置了一个属性,如果我再设置另一个属性会怎样?

  • ARFrame.cameravs Scene.pointOfView:看看他们的转型,他们似乎有点不同:

.

// ARFrame.camera.transform (matrix_float4x4)
-0.01 0.99  -0.11 0.02
-0.99 0.00  0.11  0.06
0.10  0.11  0.98  0.0
0.0   0.0   0.0   1.0

// sceneView.pointOfView.transform (SCNMatrix4)
// or sceneView.pointOfView.simdTransform^T (matrix_float4x4)
0.99  0     0.11   0
0.01  0.99  -0.12  0
-0.11 0.11  0.98   0
0.03  0.6   0.0    0.99
Run Code Online (Sandbox Code Playgroud)

它们是相同的减一轮吗?

scenekit ios11 arkit

9
推荐指数
1
解决办法
1920
查看次数

如何使用Scene Kit在Swift中获取名称中的所有子节点

我正在尝试开发一个基本游戏,我有一个场景,其中有几个子节点添加到根节点.每个节点都有两个名称之一,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中获取具有特定名称的所有子节点?

scenekit swift

9
推荐指数
1
解决办法
3571
查看次数

了解 ARKit 世界变换矩阵

在 中ARKit,当我执行命中测试时,我会返回一个ARHitTestResult. 这个的属性之一是worldTransform,我理解它包含对象位置的4x4变换矩阵 – simd_float4x4

作为对线性代数和 3D 图形非常不熟悉的人,我将如何编辑此矩阵以将其y坐标增加0.05

如果有博客文章或我可以查看的内容可以帮助我解决这个问题,请告诉我。我不确定我应该用谷歌搜索哪些术语。

对不起,如果我的问题充满了误解!您可能会说,我对这些概念不太熟悉。

感谢任何帮助的人。

matrix augmented-reality scenekit swift arkit

9
推荐指数
2
解决办法
4261
查看次数

如何让SceneView的背景透明?

我想打开一个 3D 模型并使其背景透明,以便我可以看到 SceneView 后面的 UI。我试过这段代码,但 sceneView 变成白色,不透明。


struct ModelView: View {
    var body: some View {
        ZStack {
            Text("Behind Text Behind Text Behind Text")
            SceneView(
                scene: { () -> SCNScene in
                    let scene = SCNScene()
                    scene.background.contents = UIColor.clear
                    return scene
                }(),
                pointOfView: { () -> SCNNode in
                    let cameraNode = SCNNode()
                    cameraNode.camera = SCNCamera()
                    cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
                    return cameraNode
                }(),
                options: [
                    .allowsCameraControl,
                    .temporalAntialiasingEnabled,
                ]
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用 XCode 12.5 和 iPhone …

scenekit swiftui

9
推荐指数
2
解决办法
2492
查看次数

为SpriteKit转换UITapGestureRecognizer的触摸位置 - Swift

我创建了一个游戏SceneKit sceneUIViewController.

我实现了UITapGestureRecognizer这样的:

// TAP GESTURE

let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
sceneView.overlaySKScene?.view!.addGestureRecognizer(tapGesture)
Run Code Online (Sandbox Code Playgroud)

handleTap功能:

func handleTap(sender: UIGestureRecognizer) {

    if sender.state == UIGestureRecognizerState.Ended {

        var touchLocation = sender.locationInView(sender.view)

        touchLocation = self.view.convertPoint(touchLocation, toView: self.view)

        let touchedNode = sceneView.overlaySKScene?.nodeAtPoint(touchLocation)

        if touchedNode == myNode {

            // DO SOMETHING

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

想象一下,myNode这个位置是(x: 150.0, y: 150.0).问题在于它与'sy位置' touchPosition.y的y位置相反myNode.

如何反转触摸的y位置?

谢谢 !

touch ios uitapgesturerecognizer scenekit swift

8
推荐指数
1
解决办法
6112
查看次数