3

目标是创建一个无限的棋盘图案。

使用 SCNFloor 和附加的图像,我们产生了一些接近但不太像棋盘的东西。一些黑色方块在不应该合并的地方合并。

Scale我们为、WrapSWrapTMin filterMap filter和尝试了不同的值Mip filter。屏幕截图显示了当前值。

底层图像是否不正确,或者我们需要为 SCNFloor 更改什么设置?

重复图像:

在此处输入图像描述

结果:

在此处输入图像描述

4

2 回答 2

0

看起来 SCNFloor 有接缝,赋予它无限的能力,并且可能允许系统进行一些 LOD 优化。您可能需要创建自己的地板。

于 2017-02-03T11:02:59.617 回答
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
于 2017-02-03T16:17:03.437 回答