我有一个从Blender导出的动画模型(collada).根据我的理解,着色器尝试在动画期间插入法线,我想防止这种情况发生.我的模型非常块,但Scenekit使其像Apple产品一样流畅.我希望它看起来像我的世界.
我假设你正在寻找一个类似于左下方所示的平面阴影低聚外观.
此示例使用a SCNSphere作为几何源,但它也应该对从dae文件加载的几何图形起作用.
您加载的模型和默认的SCNSphere由许多面组成.在平滑模型的情况下,顶点通常在面上共享,每个顶点只能有一个法线.我们需要做的是确保每个面不与相邻面共享顶点,并且每个顶点上使用的法线仅基于面的法线方向计算.
SceneKit本身没有任何本机功能,但Apple的另一个框架确实... ModelIO.
您需要导入ModelIO.
import ModelIO
import SceneKit.ModelIO
Run Code Online (Sandbox Code Playgroud)
我用来生成上面两个球体的代码如下所示.
let geom = SCNSphere(radius: 0.5)
// convert SceneKit geometry to ModelIO mesh object
let modelMesh = MDLMesh(scnGeometry: geom)
// ensure vertices are not shared with neighbouring faces
modelMesh.makeVerticesUnique()
// replace existing 'smooth' normal definition with an 'non-smoothed' normal
modelMesh.addNormals(withAttributeNamed: "normal", creaseThreshold: 1.0)
// create SceneKit geometry from ModelIO mesh object
let flattenedGeom = SCNGeometry(mdlMesh: modelMesh)
let flattenedNode = SCNNode(geometry: flattenedGeom)
scene.rootNode.addChildNode(flattenedNode)
// smooth sphere for comparison only
let sphereNodeSmooth = SCNNode(geometry: SCNSphere(radius: 0.5))
sphereNodeSmooth.position = SCNVector3Make(0, 1.2, 0)
scene.rootNode.addChildNode(sphereNodeSmooth)
Run Code Online (Sandbox Code Playgroud)
当然,我可能建议您在Blender中修改模型以便以这种方式导出(唯一顶点,非平滑法线).这样可以使您的应用程序不必进行比加载资产时所需的更多处理.不幸的是,我的Blender知识缺乏某种程度.
| 归档时间: |
|
| 查看次数: |
1073 次 |
| 最近记录: |