0

我已经知道如何使用doesintersectNodeCocos3d 中的 - 方法检查碰撞,但就我而言,我想在接触障碍物之前避开障碍物。例如,我想在撞到墙之前停在墙前。

出于这个原因,我getNodeAtLocation在 CC3Scene 的子-(BOOL)shouldMoveDirectionallywithDistance:(float)distance类和我的 person 类中编写了方法,这些方法应该可以移动。不幸的是,我对最后一种方法的算法有一些问题。这里的代码:

-(BOOL)shouldMoveDirectionallywithDistance:(float)distance
{
BOOL shouldMove = NO;

float x = self.person.globalLocation.x;
float z = self.person.globalLocation.z;

int times = 5;
for (int i = 0; i < times; i++) {
    CC3Vector newPos = cc3v(x, 0.5, z);
    CC3PODResourceNode *obstacle = (CC3PODResourceNode *)[myScene getNodeAtLocation:newPos];
    if (obstacle) {
        return NO;
    }else{
        shouldMove = YES;
    }
    x += self.person.globalForwardDirection.x * distance / times;
    z += self.person.globalForwardDirection.z * distance / times;
}


return shouldMove;
}

在这种方法中,我得到了坐标的重要部分(对于我的建议,只是 x 和 z 值)并将它们增加了forwardDirection. 我决定,当障碍物是薄壁时,这是有道理的。但是不知什么原因,这种方法行不通,人却能穿过这堵墙。那么我的代码中的问题在哪里?

我坚信,getNodeAtLocation- 方法可以正常工作,因为我多次测试过它,但也许有我的错误:

-(CC3Node *)getNodeAtLocation:(CC3Vector )position
{
CC3Node *node = nil;
for (CC3PODResourceNode *aNode in self.children) {
    if ([aNode isKindOfClass:[CC3PODResourceNode class]] ) {
        for (CC3PODResourceNode *child in aNode.children) {
            if (CC3BoundingBoxContainsLocation(child.globalBoundingBox, position)) {
                node = aNode;
            }
        }
    }

}

return node;
}

总而言之,在我看来,错误在于-(BOOL)shouldMoveDirectionallywithDistance:(float)distance- 方法。我想,x- 和 z-values 的增加是有问题的,但我不知道究竟是什么不正确。

4

2 回答 2

1

如果您仍然有兴趣找到此问题的答案。我也许可以为您提供替代解决方案。我即将发布我移植到 cocos3d 的 3d 碰撞引擎的免费源代码,它会给你更多的灵活性,而不是简单地将一个对象停在另一个对象前面。

我目前正在对代码进行一些改进以方便使用,但如果您有兴趣,可以给我发电子邮件至:waywardson07@aol.com

您还可以在此处对正在运行的引擎进行一些预览:http ://www.youtube.com/watch?v=QpYZlF7EktU

注意:视频有点过时了。

于 2014-01-23T06:47:40.933 回答
0

几次尝试后,似乎更容易了:只要使用doesIntersectNode方法对我来说效果是正确的。但请注意,这并不是真正解决在障碍物前停车的问题。

于 2014-01-30T17:59:09.333 回答