imj*_*eep 2 scenekit swift arkit
我试图使用SCNGeometrySource,SCNGeometryElement绘制箭头.但不能像下面的图像一样绘制精确的箭头.
是否可以绘制带有头部或箭头的简单箭头线,如下图所示.
我尝试了下面的代码,但这不起作用.
let indices: [Int32] = [0, 1,1]
let source = SCNGeometrySource(vertices: [vector1, vector2])
let element = SCNGeometryElement(indices: indices, primitiveType: .triangles)
Run Code Online (Sandbox Code Playgroud)
Xar*_*tec 13
如果箭头始终面向相机,就像在附加图像中一样,您可以使用SCNPlane并使用箭头图像作为纹理.
如果它不会一直面对相机,你可能想要给它一些厚度.如果正确完成,我不同意另一个答案是比您尝试的方法更好的解决方案.
Obj C代码(编辑:下面添加了swift版本)
int vertcount = 48;
float verts[] = { -14.923, 11.824, 25.000, -64.923, 0.000, 0.000, -14.923, -11.824, 25.000, 46.077, -5.812, 16.800, 46.077, -5.812, -16.800, 46.077, 5.812, -16.800, 46.077, 5.812, 16.800, -14.923, -11.824, -25.000, -14.923, 11.824, -25.000, -14.923, 4.974, -9.969, -14.923, 4.974, 9.969, -14.923, -4.974, 9.969, -14.923, -4.974, -9.969 };
int facecount = 13;
int faces[] = { 3, 4, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 0, 1, 2, 3, 4, 5, 6, 7, 1, 8, 8, 1, 0, 2, 1, 7, 9, 8, 0, 10, 10, 0, 2, 11, 11, 2, 7, 12, 12, 7, 8, 9, 9, 5, 4, 12, 10, 6, 5, 9, 11, 3, 6, 10, 12, 4, 3, 11};
NSData *vertsData = [NSData dataWithBytes:&verts length:sizeof(verts)];
SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithData: vertsData
semantic:SCNGeometrySourceSemanticVertex
vectorCount:vertcount
floatComponents:YES
componentsPerVector:3
bytesPerComponent:sizeof(float)
dataOffset:0
dataStride:sizeof(float)*3];
int polyIndexCount = 61;
NSData *indexPolyData = [NSData dataWithBytes:faces length:sizeof(int) * polyIndexCount];
SCNGeometryElement *element1 = [SCNGeometryElement geometryElementWithData:indexPolyData
primitiveType:SCNGeometryPrimitiveTypePolygon
primitiveCount:facecount
bytesPerIndex:sizeof(int)];
SCNGeometry *geometry1 = [SCNGeometry geometryWithSources:@[ vertexSource ] elements:@[ element1]];
//Assign the SCNGeometry to a SCNNode, for example:
//SCNNode *aNode = [[SCNNode alloc] init];
//aNode.geometry = geometry1;
Run Code Online (Sandbox Code Playgroud)
请注意,它使用多边形基本类型.
可以通过舍入浮点数来清除垂直列表.
这将创建以下3D箭头(没有顶点和边可见):
编辑:SWIFT版本:
let vertcount = 48;
let verts: [Float] = [ -1.4923, 1.1824, 2.5000, -6.4923, 0.000, 0.000, -1.4923, -1.1824, 2.5000, 4.6077, -0.5812, 1.6800, 4.6077, -0.5812, -1.6800, 4.6077, 0.5812, -1.6800, 4.6077, 0.5812, 1.6800, -1.4923, -1.1824, -2.5000, -1.4923, 1.1824, -2.5000, -1.4923, 0.4974, -0.9969, -1.4923, 0.4974, 0.9969, -1.4923, -0.4974, 0.9969, -1.4923, -0.4974, -0.9969 ];
let facecount = 13;
let faces: [CInt] = [ 3, 4, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 0, 1, 2, 3, 4, 5, 6, 7, 1, 8, 8, 1, 0, 2, 1, 7, 9, 8, 0, 10, 10, 0, 2, 11, 11, 2, 7, 12, 12, 7, 8, 9, 9, 5, 4, 12, 10, 6, 5, 9, 11, 3, 6, 10, 12, 4, 3, 11 ];
let vertsData = NSData(
bytes: verts,
length: MemoryLayout<Float>.size * vertcount
)
let vertexSource = SCNGeometrySource(data: vertsData as Data,
semantic: .vertex,
vectorCount: vertcount,
usesFloatComponents: true,
componentsPerVector: 3,
bytesPerComponent: MemoryLayout<Float>.size,
dataOffset: 0,
dataStride: MemoryLayout<Float>.size * 3)
let polyIndexCount = 61;
let indexPolyData = NSData( bytes: faces, length: MemoryLayout<CInt>.size * polyIndexCount )
let element1 = SCNGeometryElement(data: indexPolyData as Data,
primitiveType: .polygon,
primitiveCount: facecount,
bytesPerIndex: MemoryLayout<CInt>.size)
let geometry1 = SCNGeometry(sources: [vertexSource], elements: [element1])
let material1 = geometry1.firstMaterial!
material1.diffuse.contents = UIColor(red: 0.14, green: 0.82, blue: 0.95, alpha: 1.0)
material1.lightingModel = .lambert
material1.transparency = 1.00
material1.transparencyMode = .dualLayer
material1.fresnelExponent = 1.00
material1.reflective.contents = UIColor(white:0.00, alpha:1.0)
material1.specular.contents = UIColor(white:0.00, alpha:1.0)
material1.shininess = 1.00
//Assign the SCNGeometry to a SCNNode, for example:
let aNode = SCNNode()
aNode.geometry = geometry1
//aNode.scale = SCNVector3(0.1, 0.1, 0.1)
scene.rootNode.addChildNode(aNode)
Run Code Online (Sandbox Code Playgroud)
在Swift代码上面测试以仔细检查它的工作原理:
如果您需要它更小,请取消注释.scale行并尝试使用不同的值来查看您想要的小.如果您最终希望它比例为0.06,我建议通过将其中的值乘以0.06来重新生成顶点列表,然后删除刻度线.
| 归档时间: |
|
| 查看次数: |
1816 次 |
| 最近记录: |