【问题标题】:cocos3d dynamically create 3D boxcocos3d 动态创建 3D 盒子
【发布时间】:2014-10-27 02:19:24
【问题描述】:

我是 cocos3d 的新手,但我知道 cocos2d。我想动态创建 3d 盒子。所以我在 cc3layer 里面做的是

-(void) initializeControls {

    [self schedule:@selector(create_box:) interval:2 ];

}

-(void)create_box:(id)sender{

    [self unschedule:@selector(mov_cel:)];
    [[testWorld sharedcontescWorld] world_create_box];
}

在 cc3world 类中是

static testWorld *_sharedcontescWorld=nil;

+(testWorld *)sharedcontescWorld{
    @synchronized([testWorld class]){
        if (!_sharedcontescWorld)
            [self alloc];
        return _sharedcontescWorld;
    }return nil;
}
+(id)alloc{
    @synchronized([testWorld class])    {
        _sharedcontescWorld = [super alloc];
        return _sharedcontescWorld;
    }return nil;
}

    -(void) world_create_box{

    int minx=-50;
    int maxx=50;
    float posx=(float)(minx+arc4random()%maxx);

    CC3MeshNode* aNode;
    aNode = [CC3BoxNode nodeWithName: @"Simple box"];
    CC3BoundingBox bBox;
    bBox.minimum = cc3v(-10.0, -10.0, -10.0);
    bBox.maximum = cc3v( 10.0,  10.0,  10.0);
    [aNode populateAsSolidBox: bBox];
    [aNode setLocation:cc3v(posx,0,0)];
    aNode.material = [CC3Material material];
    [self addChild:aNode];
    id move3d=[CC3MoveTo actionWithDuration:1 moveTo:cc3v(posx,0,100)];
    id remove=[CCCallFuncND actionWithTarget:self selector:@selector(removeObj:)];
    [aNode runAction:[CCSequence actions:move3d,remove,nil]];

}

但它不起作用......有人可以帮助我吗?

【问题讨论】:

    标签: cocos3d


    【解决方案1】:

    您是否也设置了相机和灯光?

    如果没有摄像头信息,这很难说,但我认为您可能没有在看立方体(摄像头丢失或瞄准错误),或者立方体太大而您在里面。

    尝试使用相机和灯光,以及一些更适中的尺寸。

    下面是一些在 cocos3d XCode 项目模板中对我有用的示例代码:

            // Create the camera, place it back a bit, and add it to the world
            CC3Camera* cam = [CC3Camera nodeWithName: @"Camera"];
            cam.location = cc3v( 0.0, 0.0, 10.0 );
            [self addChild: cam];
    
            // Create a light, place it back and to the left at a specific
            // position (not just directional lighting), and add it to the world
            CC3Light* lamp = [CC3Light nodeWithName: @"Lamp"];
            lamp.location = cc3v( -2.0, 0.0, 0.0 );
            lamp.isDirectionalOnly = NO;
            [cam addChild: lamp];
    
    
            float maxx=5.0;
            float posx=CCRANDOM_MINUS1_1()*maxx;
    
            CC3BoxNode* aNode;
            aNode = [CC3BoxNode nodeWithName: @"Simple box"];
            CC3BoundingBox bBox;
            bBox.minimum = cc3v(-1.0, -1.0, -1.0);
            bBox.maximum = cc3v( 1.0,  1.0,  1.0);
            [aNode populateAsSolidBox: bBox];
            [aNode setLocation:cc3v(posx,0.0f,-5.0f)];
            aNode.material = [CC3Material material];
            [self addChild:aNode];
            id move3d=[CC3MoveTo actionWithDuration:1.0f moveTo:cc3v(posx*-1.0,0.0f,-5.0f)];
    //      id remove=[CCCallFuncND actionWithTarget:self selector:@selector(removeChild:)];
            [aNode runAction:[CCSequence actions:move3d,/*remove,*/nil]];
    

    注意事项:

    • cocos3d 自述文件有安装 XCode 项目模板的说明,如果您还没有的话。

    • 我用这个东西替换了模板中所有的“Hello World”对象代码(注意它是相同的相机和灯光代码/cmets);你可以离开它,但你会在你的盒子前面有一些话。

    • 为了清晰起见,将 CC3MeshNode 更改为 CC3BoxNode,但 CC3MeshNode 也完全可以工作。

    • 将 arc4random() 替换为 cocos2d 辅助函数 CCRANDOM_MINUS1_1() 只是为了便于阅读(并分享这个 cocos2d 宝石)。

    • 注释掉 CCFuncCallND 因为我没有 removeObj 函数。希望你这样做。 ;)

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我还没有开始使用 cocos3d,但我在 stackoverflow 上发现了这段代码可以工作

      CC3BoundingBox bounds = makeBounds(9.5, 5.0, 4.0, 0, 0, 0);
      CC3MeshNode *cube = [[CC3MeshNode alloc] init];
      [cube populateAsSolidBox:bounds];
      

      【讨论】:

        【解决方案3】:

        有一个 CC3BoxNode 类可以帮助您做到这一点。例如:

                CC3BoxNode      *box        = [CC3BoxNode nodeWithName:@"MyBox"];
                [box populateAsSolidBox:CC3BoxMake(-1, -1, -1, 1, 1, 1)];
                [self addChild:box];
        

        这将创建一个 2x2x2 的框,其原点位于其绝对中心。 希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-24
          • 2017-02-04
          • 2014-03-26
          • 2016-04-09
          • 1970-01-01
          • 2012-08-03
          • 1970-01-01
          相关资源
          最近更新 更多