2017-02-03 4 views
2

目標は、無限チェス盤のパターンを作成することです。SceneKit:画像からSCNFloorのチェス盤パターンを作成するには?

SCNFloorと添付の画像を使用して、私たちは近くにチェス盤に近いものを作り出しますが、いくつかの黒い正方形は、それらがしてはならないところで合併する。

我々はScaleWrapSWrapTMin filterMap 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

ありがとうKarl。あなたはこのアプローチを試して、それが演奏されていることを保証できますか?もしそうでなければ、私はいくつかを試すことができますが、私はこのアプローチがSCNFloorほどのパフォーマンスではないと懸念しています。 – Crashalot

関連する問題