cocos3d динамически создает 3D box
Я новичок в 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]];
}
но это не работает...... кто-нибудь может мне помочь?
3 ответа
Я не начал с cocos3d, но я нашел этот код в stackru, который работает
CC3BoundingBox bounds = makeBounds(9.5, 5.0, 4.0, 0, 0, 0);
CC3MeshNode *cube = [[CC3MeshNode alloc] init];
[cube populateAsSolidBox:bounds];
Существует класс CC3BoxNode, который поможет вам сделать это. Например:
CC3BoxNode *box = [CC3BoxNode nodeWithName:@"MyBox"];
[box populateAsSolidBox:CC3BoxMake(-1, -1, -1, 1, 1, 1)];
[self addChild:box];
Это создаст коробку 2x2x2 с точкой начала в абсолютном центре. Надеюсь, это поможет.
У вас есть камера и свет?
Без информации о камере трудно сказать, но я думаю, что вы можете либо не смотреть на куб (камера отсутствует или нацелена неправильно), либо куб слишком большой, и вы внутри него.
Попробуйте это с камерой и светом, и некоторыми более скромными размерами.
Вот пример кода, который работал для меня в шаблоне проекта 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]];
Заметки:
В readme для cocos3d есть инструкции по установке шаблонов проекта XCode, если вы этого еще не сделали.
Я заменил весь объектный код "Hello World" в шаблоне этим материалом (обратите внимание, что это та же камера и световой код / комментарии); Вы можете оставить это, но у вас будет несколько слов перед вашей коробкой.
Для ясности изменил CC3MeshNode на CC3BoxNode, но полностью CC3MeshNode тоже работает.
Заменил arc4random() вспомогательной функцией cocos2d CCRANDOM_MINUS1_1() просто для удобства чтения (и для совместного использования этого драгоценного камня cocos2d).
Прокомментировал CCFuncCallND, потому что у меня не было функции removeObj. Надеюсь, что вы делаете.;)
Надеюсь, это поможет.