gpt4 book ai didi

ios - Cocos3d 中遇到障碍物时停止

转载 作者:行者123 更新时间:2023-11-29 03:43:51 24 4
gpt4 key购买 nike

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

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

-(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 值的增加出了问题,但我无法弄清楚到底哪里出了问题。

最佳答案

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

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

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

注意:视频有点过时。

关于ios - Cocos3d 中遇到障碍物时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com