绘制没有对角线的 SCNBox 边缘?
Drawing edges of SCNBox without diagonal line?
我正在使用 Apple 的 ARKit 制作 AR 应用程序,我想制作盒子的线框轮廓。代码中描述并显示在图片中的那个在盒子的每个面上绘制斜边。它还隐藏了盒子另一侧的角。 Scene Kit 中有没有办法让我摆脱对角线并使盒子透明,显示所有边和顶点?
let box:SCNNode = SCNNode(geometry: SCNBox(width: CGFloat(0.1), height: CGFloat(0.1), length: CGFloat(0.1), chamferRadius: CGFloat(0)))
box.geometry?.firstMaterial?.fillMode = .lines
box.geometry?.firstMaterial?.diffuse.contents = UIColor.green
我不确定如何去掉对角线。
但是将 material 设置为双面会在框的另一侧绘制线条。
box.geometry?.firstMaterial?.isDoubleSided = true
编辑:
这是实现您想要的效果的另一种方法(摆脱那些对角线!)
let sm = "float u = _surface.diffuseTexcoord.x; \n" +
"float v = _surface.diffuseTexcoord.y; \n" +
"int u100 = int(u * 100); \n" +
"int v100 = int(v * 100); \n" +
"if (u100 % 99 == 0 || v100 % 99 == 0) { \n" +
" // do nothing \n" +
"} else { \n" +
" discard_fragment(); \n" +
"} \n"
let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
box.firstMaterial?.emission.contents = UIColor.green
box.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPoint.surface: sm]
box.firstMaterial?.isDoubleSided = true
当您使用 SCNBox
创建一个 SCNGeometry
对象时,创建的几何体由 12 个三角形组成,当您将 fillMode
设置为 .lines
时,SceneKit 绘制边每个三角形。这意味着除非您在调用 SCNBox
后自己修改几何体或创建自定义几何体,告诉 SceneKit 确切绘制哪些线,否则我认为您无法摆脱那些对角线。
一种方法是制作一个透明的 .png 图像纹理,除了边缘周围的边框。
然后,将其作为 material 的 diffuse
内容附加到您正在创建的任何对象。 (我在委托方法中做了我的,但这可以很容易地提取到任何 class 你最终生成你的几何图形。)
// MARK: - ARSCNViewDelegate
// Override to create and configure nodes for anchors added to the view's session.
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
// Create our Cube
let shape = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.contents = UIImage(named: "art.scnassets/border.png")
material.transparencyMode = .aOne
shape.materials = [material]
// Throw it on a node
let newNode = SCNNode(geometry: shape)
return newNode
}
我正在使用 Apple 的 ARKit 制作 AR 应用程序,我想制作盒子的线框轮廓。代码中描述并显示在图片中的那个在盒子的每个面上绘制斜边。它还隐藏了盒子另一侧的角。 Scene Kit 中有没有办法让我摆脱对角线并使盒子透明,显示所有边和顶点?
let box:SCNNode = SCNNode(geometry: SCNBox(width: CGFloat(0.1), height: CGFloat(0.1), length: CGFloat(0.1), chamferRadius: CGFloat(0)))
box.geometry?.firstMaterial?.fillMode = .lines
box.geometry?.firstMaterial?.diffuse.contents = UIColor.green
我不确定如何去掉对角线。
但是将 material 设置为双面会在框的另一侧绘制线条。
box.geometry?.firstMaterial?.isDoubleSided = true
编辑:
这是实现您想要的效果的另一种方法(摆脱那些对角线!)
let sm = "float u = _surface.diffuseTexcoord.x; \n" +
"float v = _surface.diffuseTexcoord.y; \n" +
"int u100 = int(u * 100); \n" +
"int v100 = int(v * 100); \n" +
"if (u100 % 99 == 0 || v100 % 99 == 0) { \n" +
" // do nothing \n" +
"} else { \n" +
" discard_fragment(); \n" +
"} \n"
let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
box.firstMaterial?.emission.contents = UIColor.green
box.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPoint.surface: sm]
box.firstMaterial?.isDoubleSided = true
当您使用 SCNBox
创建一个 SCNGeometry
对象时,创建的几何体由 12 个三角形组成,当您将 fillMode
设置为 .lines
时,SceneKit 绘制边每个三角形。这意味着除非您在调用 SCNBox
后自己修改几何体或创建自定义几何体,告诉 SceneKit 确切绘制哪些线,否则我认为您无法摆脱那些对角线。
一种方法是制作一个透明的 .png 图像纹理,除了边缘周围的边框。
然后,将其作为 material 的 diffuse
内容附加到您正在创建的任何对象。 (我在委托方法中做了我的,但这可以很容易地提取到任何 class 你最终生成你的几何图形。)
// MARK: - ARSCNViewDelegate
// Override to create and configure nodes for anchors added to the view's session.
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
// Create our Cube
let shape = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.contents = UIImage(named: "art.scnassets/border.png")
material.transparencyMode = .aOne
shape.materials = [material]
// Throw it on a node
let newNode = SCNNode(geometry: shape)
return newNode
}