Swift中的自定义SceneKit几何在iOS上不起作用,但是等同的Objective C代码

Swift中的自定义SceneKit几何在iOS上不起作用,但是等同的Objective C代码,第1张

概述我一直使用这个网站,但这是我的第一个问题. 我渴望采用新的Swift语言,因为这似乎是苹果开发的前进之路.我也对iOS 8中的新的SceneKit支持印象深刻.我想在运行时编程地创建自定义几何,但我正在努力使Swift代码工作.然而Objective C中的等效代码可以正常工作. 这可能是一个错误,或者我做错了的事情. 我只是想创建和渲染一个三角形.为了简单起见,我将忽略法线和纹理等.所以我只期待 我一直使用这个网站,但这是我的第一个问题.

我渴望采用新的Swift语言,因为这似乎是苹果开发的前进之路.我也对iOS 8中的新的SceneKit支持印象深刻.我想在运行时编程地创建自定义几何,但我正在努力使Swift代码工作.然而Objective C中的等效代码可以正常工作.

这可能是一个错误,或者我做错了的事情.

我只是想创建和渲染一个三角形.为了简单起见,我将忽略法线和纹理等.所以我只期待看到一个黑色的三角形.

Swift代码(不工作)

var verts = [SCNVector3(x: 0,y: 0,z: 0),SCNVector3(x: 1,SCNVector3(x: 0,y: 1,z: 0)]let src = SCNGeometrySource(vertices: &verts,count: 3)let indexes:Int[]=[0,1,2]let dat  = NSData(bytes: indexes,length: sizeofValue(indexes))let ele = SCNGeometryElement(data:dat,primitiveType: .Triangles,primitiveCount: 1,bytesPerIndex: sizeof(Int))let geo = SCNGeometry(sources: [src],elements: [ele])let nd = SCNNode(geometry: geo)scene.rootNode.addChildNode(nd)

目标C代码(它有效)

SCNVector3 verts[] = { SCNVector3Make(0,0),SCNVector3Make(1,SCNVector3Make(0,0) };SCNGeometrySource *src = [SCNGeometrySource geometrySourceWithVertices:verts count:3];int indexes[] = { 0,2 };NSData *datIndexes = [NSData dataWithBytes:indexes length:sizeof(indexes)];SCNGeometryElement *ele = [SCNGeometryElement geometryElementWithData:datIndexes primitiveType:SCNGeometryPrimitiveTypeTriangles primitiveCount:1 bytesPerIndex:sizeof(int)];SCNGeometry *geo = [SCNGeometry geometryWithSources:@[src] elements:@[ele]];SCNNode *nd = [SCNNode nodeWithGeometry:geo];d[scene.rootNode addChildNode:nd];

任何指针(赦免双关语)将不胜感激.

谢谢

那么这两个代码并不能完全相互转换. C中的int与Swift中的Int不同.它实际上被称为CInt在Swift:
/// The C 'int' type.typealias CInt = Int32

如果您更改两次出现以使用CInt,则您以前收到的错误消息将消失(至少对于我在OS X *** 场中,但是它仍然不会为我呈现任何东西.

我不认为sizeofValue用于返回数组的大小.它看起来像我的返回指针的大小:

let indexes: CInt[] = [0,2]sizeofValue(indexes)                   // is 8sizeof(CInt)                           // is 4sizeof(CInt) * countElements(indexes)  // is 12// compare to other CInt[]let empty: CInt[] = []let large: CInt[] = [0,2,3,4,5,6,7,8,9]sizeofValue(indexes)                   // is 8 (your array of indices again)sizeofValue(empty)                     // is 8sizeofValue(large)                     // is 8

所以,对于我来说,以下代码的工作原理(我把参数放在不同的行上,以便更容易指出我的更改):

let src = SCNGeometrySource(vertices: &verts,count: 3)let indexes: CInt[] = [0,2] // Changed to CIntlet dat  = NSData(    bytes: indexes,length: sizeof(CInt) * countElements(indexes) // Changed to size of CInt * count)let ele = SCNGeometryElement(    data: dat,bytesPerIndex: sizeof(CInt) // Changed to CInt)let geo = SCNGeometry(sources: [src],elements: [ele])let nd = SCNNode(geometry: geo)scene.rootNode.addChildNode(nd)

有了这个结果:

总结

以上是内存溢出为你收集整理的Swift中的自定义SceneKit几何在iOS上不起作用,但是等同的Objective C代码全部内容,希望文章能够帮你解决Swift中的自定义SceneKit几何在iOS上不起作用,但是等同的Objective C代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1026978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存