此代码摘录(场景、摄像机、光线等从代码中剪切出来)在Swift中在iOS模拟器上工作:
let boxNode = SCNNode()
// Create a box
boxNode.geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.1)
let numFaces = 6
scene.rootNode.addChildNode(boxNode)
// create and configure a material for each face
var materials: [SCNMaterial] = Array()
for i in 1...numFaces
{
let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "texture")
materials += material
}
// set the material to the 3d object geometry
boxNode.geometry.materials = materials它生成一个盒子,每一张脸都是格子图像。

在Wings3D中创建一个简单的股票几何图形,保存到一个DAE中,然后加载到应用程序中,尝试同样的方法,它给了我一个合适的形状,但是没有阴影和图像出现在脸上:
let boxNode = SCNNode()
// Load the geometry
let urlToColladaFile = NSBundle.mainBundle().URLForResource("Objects", withExtension:"dae")
let sceneSource = SCNSceneSource(URL:urlToColladaFile, options:nil)
boxNode.geometry = sceneSource.entryWithIdentifier("dodecahedron3-0", withClass:SCNGeometry.self) as SCNGeometry
let numFaces = 10
scene.rootNode.addChildNode(boxNode)
// create and configure a material for each face
var materials: [SCNMaterial] = Array()
for i in 1...numFaces
{
let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "texture")
materials += material
}
// set the material to the 3d object geometry
boxNode.geometry.materials = materials

我遗漏了什么?
发布于 2014-07-15 20:57:03
谢谢,蠢货和蓖麻。您的演绎让我在Wings3D中研究了我的选择,并且我能够在Wings3D中解决问题。
总之,我需要创建一个UV映射每一个表面的固体。
对于正多面体,我有多种选择:
这一切变得有点复杂,如果我开始增加边框或平滑的倒角,因为现在,我需要确保紫外线映射是有意义的每一组脸,我的工作。同样,网上也有关于这方面的教程。
再次感谢!
干杯,亨利
发布于 2014-07-12 11:10:06
你的几何图形有纹理坐标吗?您可以通过编程(通过检查是否存在具有SCNGeometrySourceSemanticTexcoord语义的源)或在内置于Xcode中的SceneKit编辑器中验证这一点。
还要注意的是,每个几何元素不需要创建一个材料。如果它们都是相同的,只需建立一个材料阵列,它将用于整个几何。
发布于 2016-04-11 06:12:33
首先,当你设计3D物体时,你必须定义材料。
然后以编程方式为每个材料分配纹理。
let material1 = SCNMaterial()
material1.diffuse.contents = UIImage(named: "1")?.xFlipped
material1.locksAmbientWithDiffuse = true
let material2 = SCNMaterial()
material2.diffuse.contents = UIImage(named: "2")?.xFlipped
material2.locksAmbientWithDiffuse = true
...
let material12 = SCNMaterial()
material12.diffuse.contents = UIImage(named: "12")?.xFlipped
material12.locksAmbientWithDiffuse = true
scene.rootNode.childNodeWithName("Dice", recursively: false)?.geometry?.materials = [material1, material2, material3, material4, material5, material6, material7, material8, material9, material10, material11, material12]其中"Dice“是在属性检查器中设置的对象标识名。
extension UIImage {
var xFlipped: UIImage {
let tempImageView = UIImageView(frame: CGRectMake(0, 0, self.size.width, self.size.height))
tempImageView.image = self
let viewTempImage = UIView(frame: tempImageView.frame)
viewTempImage.addSubview(tempImageView)
tempImageView.transform = CGAffineTransformMakeScale(-1, 1)
let img = viewTempImage.screenshot
return img
}
}
extension UIView {
var screenshot: UIImage{
UIGraphicsBeginImageContext(self.bounds.size);
let context = UIGraphicsGetCurrentContext();
self.layer.renderInContext(context!)
let screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return screenShot
}
}注意:在我的案例中,当我添加纹理时,它是水平翻转的。所以我像上面那样手动翻转。
https://stackoverflow.com/questions/24710609
复制相似问题