当前位置:  开发笔记 > IOS > 正文

SceneKit中的iOS自定义几何体

如何解决《SceneKit中的iOS自定义几何体》经验,为你挑选了1个好方法。

我无法尝试使用纹理贴图在iOS模拟器上运行一个简单的四边形.我已经阅读了这里涉及类似事情的所有其他问题而且我被困住了.输出如下所示:

在此输入图像描述

纹理是这样的:

在此输入图像描述

我的代码是这样的:

  // v1 +----+ v0
  //    |    |
  // v2 +----+ v3



  SCNVector3 vertices[] = { SCNVector3Make(  5.0,  5.0, 0.0),
                            SCNVector3Make( -5.0,  5.0, 0.0),
                            SCNVector3Make( -5.0, -5.0, 0.0),
                            SCNVector3Make(  5.0, -5.0, 0.0)
  };

  SCNVector3 normals[] = { SCNVector3Make( 0.0f, 0.0f, 1.0),
                           SCNVector3Make( 0.0f, 0.0f, 1.0),
                           SCNVector3Make( 0.0f, 0.0f, 1.0),
                           SCNVector3Make( 0.0f, 0.0f, 1.0)
  };

  CGPoint textureCoordinates[] = { CGPointMake( 1.0, 1.0),
                                   CGPointMake( 0.0, 1.0),
                                   CGPointMake( 0.0, 0.0),
                                   CGPointMake( 1.0, 0.0)
  };

  NSUInteger vertexCount = 4;


  NSMutableData *indicesData = [NSMutableData data];
  UInt8 indices[] = { 0, 1, 2, 0, 2, 3};
  [indicesData appendBytes:indices length:sizeof(UInt8)*6];
  SCNGeometryElement *indicesElement = [SCNGeometryElement geometryElementWithData:indicesData
                                                                     primitiveType:SCNGeometryPrimitiveTypeTriangles
                                                                    primitiveCount:2
                                                                     bytesPerIndex:sizeof(UInt8)];

  NSMutableData *vertexData = [NSMutableData dataWithBytes:vertices length:vertexCount * sizeof(SCNVector3)];

  SCNGeometrySource *verticesSource = [SCNGeometrySource geometrySourceWithData:vertexData
                                                                       semantic:SCNGeometrySourceSemanticVertex
                                                                    vectorCount:vertexCount
                                                                floatComponents:YES
                                                            componentsPerVector:3
                                                              bytesPerComponent:sizeof(float)
                                                                     dataOffset:0
                                                                     dataStride:sizeof(SCNVector3)];

  NSMutableData *normalData = [NSMutableData dataWithBytes:normals length:vertexCount * sizeof(SCNVector3)];

  SCNGeometrySource *normalsSource = [SCNGeometrySource geometrySourceWithData:normalData
                                                                      semantic:SCNGeometrySourceSemanticNormal
                                                                   vectorCount:vertexCount
                                                               floatComponents:YES
                                                           componentsPerVector:3
                                                             bytesPerComponent:sizeof(float)
                                                                    dataOffset:0
                                                                    dataStride:sizeof(SCNVector3)];

  NSMutableData *textureData = [NSMutableData dataWithBytes:textureCoordinates length:vertexCount * sizeof(CGPoint)];

  SCNGeometrySource *textureSource = [SCNGeometrySource geometrySourceWithData:textureData
                                                                      semantic:SCNGeometrySourceSemanticTexcoord
                                                                   vectorCount:vertexCount
                                                               floatComponents:YES
                                                           componentsPerVector:2
                                                             bytesPerComponent:sizeof(float)
                                                                    dataOffset:0
                                                                    dataStride:sizeof(CGPoint)];
 SCNGeometry *geometry = [SCNGeometry geometryWithSources:@[verticesSource, normalsSource, textureSource]
                                                  elements:@[indicesElement]];


  SCNMaterial *material = [SCNMaterial material];
  //material.diffuse.contents = [UIColor redColor];
  material.diffuse.contents = [UIImage imageNamed:@"diffuse.jpg"];
  material.diffuse.wrapS = SCNWrapModeRepeat;
  material.diffuse.wrapT = SCNWrapModeRepeat;
  material.diffuse.contentsTransform = SCNMatrix4MakeScale( 1.0f, 1.0f, 1.0f);
  material.doubleSided = YES;

  material.normal.wrapS = SCNWrapModeRepeat;
  material.normal.wrapT = SCNWrapModeRepeat;
  //    material.litPerPixel = YES;

  geometry.materials = @[material];

[编辑]我用这段代码尝试了很多不同的东西,似乎没什么用.我还没有在Objective-C中看到适用于iOS的工作示例.对material.diffuse.wrapS的任何更改都无效.

我之前在OpenGL中做过这种事情没有任何问题,但我已经盯着这段代码好几天了,看不出我的错误.任何帮助将非常感激.



1> Brett..:

@ Paul-Jan让我走上了正确的轨道,这引出了我的答案:

将我的纹理坐标从CGPoint更改为浮动可以修复它.

  float textureCoordinates[] = {  1.0, 1.0,
                                  0.0, 1.0,
                                  0.0, 0.0,
                                  1.0, 0.0
  };

  NSMutableData *textureData = [NSMutableData dataWithBytes:textureCoordinates length:vertexCount * sizeof(float) * 2];

  SCNGeometrySource *textureSource = [SCNGeometrySource geometrySourceWithData:textureData
                                                                      semantic:SCNGeometrySourceSemanticTexcoord
                                                                   vectorCount:vertexCount
                                                               floatComponents:YES
                                                           componentsPerVector:2
                                                             bytesPerComponent:sizeof(float)
                                                                    dataOffset:0
                                                                    dataStride:sizeof(float) * 2];

结果:

在此输入图像描述

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有