2017-02-03 7 views
2

Целью является создание бесконечного рисунка шахматной доски.SceneKit: как создать рисунок шахматной доски для SCNFloor с изображения?

Используя SCNFloor и прилагаемое изображение, мы производим что-то близкое, но не совсем похожее на шахматную доску. Некоторые черные квадраты сливаются там, где они не должны.

Мы пробовали различные значения для Scale, WrapS, WrapT, Min filter, Map filter и Mip filter. На снимке экрана показаны текущие значения.

Неправильное ли исходное изображение или какие настройки необходимо изменить для SCNFloor?

повторяющееся изображение:

enter image description here

Результат:

enter image description here

+0

Я попробовал вашу текстуру на SCNFloor, и квадраты выглядели регулярно, в отличие от вашего снимка экрана. Вы изменили какие-либо другие настройки? –

+0

@JamesP nope. Итак, вы говорите, что ваш SCNFloor выглядит как обычная шахматная доска? Вы просто использовали настройки по умолчанию? – Crashalot

+0

Да, все по умолчанию, масштаб 1. Похоже, вы ожидали. Ваша маленькая область предварительного просмотра в углу тоже выглядит неправильно, текстура смещена, по-моему, она центрирована. –

ответ

0

Похоже SCNFloor имеет швов, что дает ему возможность быть бесконечным, и, вероятно, позволяет некоторым количество оптимизации LOD системой. Возможно, вам придется создать свой собственный пол.

+0

Во второй раз я пойду в замешательство и скажу, что для этого вам не нужно изображение. Все, что вам нужно, это сделать пол из многих самолетов. Каждая плоскость будет иметь либо белый материал, либо черный материал. Вы можете делиться геометрией и материалом для всех белых узлов и всех черных узлов. Все узлы будут привязаны к родительскому узлу. –

+0

@KarlSigiscar спасибо, но немного смущен. Как вы используете несколько самолетов для имитации пола? Как вы накладываете белую плоскость на черную плоскость (или любые цвета/изображения, если не черные/белые), чтобы создать рисунок шахматной доски? – Crashalot

0
#import "GameViewController.h" 

@interface GameViewController() 

@property (nonatomic) CGFloat chessBoardWidth; 
@property (nonatomic) CGFloat chessBoardDepth; 
@property (nonatomic) CGFloat tileWidth; 
@property (nonatomic) CGFloat tileDepth; 
@property (nonatomic, getter=isOdd) BOOL odd; 

@end 

@implementation GameViewController 

-(instancetype)init { 
    self = [super init]; 

    if(self) { 
     self.chessBoardWidth = 10.0f; 
     self.chessBoardDepth = 10.0f; 
     self.tileWidth = 1.0f; 
     self.tileDepth = 1.0f; 
    } 

    return self; 
} 

-(void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    // create a new scene 
    SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/chessboard.scn"]; 

    // create and add a camera to the scene 
    SCNNode *cameraNode = [SCNNode node]; 
    cameraNode.camera = [SCNCamera camera]; 
    [scene.rootNode addChildNode:cameraNode]; 

    // place the camera 
    cameraNode.position = SCNVector3Make(0, 0, 150); 

    // create and add a light to the scene 
    SCNNode *lightNode = [SCNNode node]; 
    lightNode.light = [SCNLight light]; 
    lightNode.light.type = SCNLightTypeOmni; 
    lightNode.position = SCNVector3Make(0, 10, 10); 
    [scene.rootNode addChildNode:lightNode]; 

    // create and add an ambient light to the scene 
    SCNNode *ambientLightNode = [SCNNode node]; 
    ambientLightNode.light = [SCNLight light]; 
    ambientLightNode.light.type = SCNLightTypeAmbient; 
    ambientLightNode.light.color = [NSColor darkGrayColor]; 
    [scene.rootNode addChildNode:ambientLightNode]; 

    // Material 

    SCNMaterial *blackMaterial = [SCNMaterial material]; 
    blackMaterial.diffuse.contents = [NSColor blackColor]; 

    SCNMaterial *whiteMaterial = [SCNMaterial material]; 
    whiteMaterial.diffuse.contents = [NSColor whiteColor]; 

    // Geometry 

    SCNPlane *blackTile = [[SCNPlane alloc] init]; 
    blackTile.firstMaterial = blackMaterial; 

    SCNPlane *whiteTile = [[SCNPlane alloc] init]; 
    whiteTile.firstMaterial = whiteMaterial; 

    // Parent node 

    SCNNode *parentNode = [[SCNNode alloc] init]; 
    [scene.rootNode addChildNode:parentNode]; 

    self.odd = YES; 

    for (uint x=0; x < self.chessBoardWidth; x++) { 
     for (uint z=0; z < self.chessBoardDepth; z++) { 

      // Add tile 

      SCNNode *tileNode = [[SCNNode alloc] init]; 

      if(self.isOdd) { 
       tileNode.geometry = blackTile; 
      } else { 
       tileNode.geometry = whiteTile; 
      } 

      [parentNode addChildNode:tileNode]; 

      // Position tile 
      tileNode.position = SCNVector3Make(self.tileWidth * x, 0, self.tileDepth * z); 

      // Alternate 

      if(self.isOdd) { 
       self.odd = NO; 
      } else { 
       self.odd = YES; 
      } 
     } 
    } 

    // set the scene to the view 
    self.gameView.scene = scene; 

    // allows the user to manipulate the camera 
    self.gameView.allowsCameraControl = YES; 

    // show statistics such as fps and timing information 
    self.gameView.showsStatistics = YES; 

    // configure the view 
    self.gameView.backgroundColor = [NSColor grayColor]; 
} 

@end 
+0

Спасибо! Но это создаст бесконечную доску, такую ​​как SCNFloor? Неясно, для чего нужны 'chessBoardWidth' и' chessBoardDepth', если это бесконечно? Не фиксировали ли эти значения, например, что если камера движется мимо 'chessBoardDepth', шахматная доска исчезает? – Crashalot

+0

Правда, вы можете увеличить эти значения или размер плитки и убедиться, что она всегда закрывается для просмотра усечения камеры. Он не должен быть бесконечным. –

+0

Спасибо, Карл. Вы пробовали этот подход и можете ручаться за то, что он работает? Если нет, я могу проверить некоторые из них, но я обеспокоен тем, что этот подход не так эффективен, как SCNFloor. – Crashalot

 Смежные вопросы

  • Нет связанных вопросов^_^