这是3D Camera 的bug还是我哪里搞错了?

我用的是cocos2d-x 3.4final
我场景里面有两个对象,一个是路面一个是车.
路面和车子模型建模的时候都是以xy面为地面进行的(我也试过以xz为路面进行建模然后调整Camera的位置和lookAt位置,结果和以xy为地面是一样的)。
当我把相机设置成从马路这头看向对面那头时车子被路面覆盖住了(见图一,从顶点数可以看出来车子确实是有绘制,只是被路面挡住了)。代码如下:
mCamera = Camera::createPerspective(60, vs.width/vs.height, 0.01, 2600);
mCamera->setCameraFlag(CameraFlag::USER1);
mCamera->setPosition3D(Vec3(vs.width/2, 0, 1100));
mCamera->lookAt(Vec3(vs.width/2,vs.height*3/5,0));
addChild(mCamera);

Sprite3D* test = Sprite3D::create("road.c3b");
test->setPosition3D(Vec3(vs.width/2, vs.height/2, 0));
test->setCameraMask((unsigned int)CameraFlag::USER1);
addChild(test);

Sprite3D* car1 = Sprite3D::create("car1.c3b");
car1->setPosition3D(Vec3(vs.width/2, vs.height/2,42.1));
car1->setCameraMask((unsigned int)CameraFlag::USER1);
addChild(car1);

当我把相机设置成俯视马路这时候车子显示正常了(见图二)。代码如下:
mCamera = Camera::createPerspective(60, vs.width/vs.height, 0.01, 2600);
mCamera->setCameraFlag(CameraFlag::USER1);
mCamera->setPosition3D(Vec3(vs.width/2, vs.height/2, 1100));
mCamera->lookAt(Vec3(vs.width/2,vs.height/2,0));
addChild(mCamera);
//其他代码同上

可以看到,两份代码只有两行有差异,其他全部相同
这是车子被马路覆盖的代码:

mCamera->setPosition3D(Vec3(vs.width/2, 0, 1100));
mCamera->lookAt(Vec3(vs.width/2,vs.height*3/5,0));

这是车子正常显示在马路上面的代码:

mCamera->setPosition3D(Vec3(vs.width/2, vs.height/2, 1100));
mCamera->lookAt(Vec3(vs.width/2,vs.height/2,0));

两份代码我只是改变了一下相机的位置和lookAt的位置显示结果就有这么大的差别我也是晕了,网上关于Camera的教程也只是简单介绍了一下相机的使用,我看了很多篇,感觉相机这个东西用起来挺简单的呀,怎么会有这这种神奇的事情发生呢?
这是Camera的bug还是我没有用对呢?
求大神指点迷津。

Looks like you changed the Y value of the camera’s position from 0 to match the Y value of the lookAt, thus the camera is looking straight down.

我这确认过源码是没有问题了,你再看一下

呵呵,这样真的有意思吗?
我的问题是,车子的位置一直都是在路面以上的,为什么路面一直都能显示出来可是车子却一下在路面上一下被路面挡住呢?
我发现车子是否显示和Camera::createPerspective(60, vs.width/vs.height, 0.01, 2600);的第一个参数有关系,这个参数是可视角度,当可视角度设置成30时车子在第一种写法里也是能显示出来的。

嗯,我在看看,有可能是你说的这样,但是我的Camera的位置放在相对马路那么高的地方怎么会看到背面呢?

照你的描述可能是被近裁剪面裁剪了,你可以给车加一个action往-z方向移动证实一下

我试了下你说的让车子移动,车子在路的两头会出现一下,然后在路的中段完全被路面覆盖着,这应该不是被近裁剪面裁剪了。
然后也不是看到了路的背面,路的背面我模型里面是剔除的。
我把模型文件上传了,能否帮我看看是什么问题?

我晕,你这模型是建在XOZ平面的啊,你上面的代码分明看向的是XOY平面,不清楚你截图的效果是怎么出来的。我都是把模型绕x轴旋转了90度才会显示你截图的效果,而且我这边也并没有出现车被裁剪的情况。
如果你想看向XOZ平面,lookat的第二个up参数得改啊,比如正Z,默认是正Y轴。

不好意思,是我搞错了。
是这样的,这个帖子的代码的时候我用的还是还是xoy平面上的模型,后来上传的模型对象的时候我又把模型改到xoz平面上了。
这个才是xoy平面的模型。
能看看你那边的代码吗?我这边把lookat的第二个up参数设成(0,-1,0)车子就能显示出来了,但是在平幕上是倒过来的。可是如果用默认的设置chez又出不来。

此外我发现车子动的时候有黑缝隙,这个是什么原因呢?模型哪里不对吗?

你的模型还是有问题,我用的第一次的模型,用的你的code,只不过加了x轴旋转的code,估计是没影响的,cocos V3.4 final版本,没有出现你所说的情况,code如下:
auto mCamera = Camera::createPerspective(60, vs.width / vs.height, 0.01, 2600);
mCamera->setCameraFlag(CameraFlag::USER1);
mCamera->setPosition3D(Vec3(vs.width / 2, 0, 1100));
mCamera->lookAt(Vec3(vs.width / 2, vs.height * 3 / 5, 0));
addChild(mCamera);

Sprite3D* test = Sprite3D::create("road.c3b");
test->setPosition3D(Vec3(vs.width / 2, vs.height / 2, 0));
test->setRotation3D(Vec3(90.0f, 0.0f, 0.0f));
test->setCameraMask((unsigned int)CameraFlag::USER1);
addChild(test);

Sprite3D* car1 = Sprite3D::create("car1.c3b");
car1->setPosition3D(Vec3(vs.width / 2, vs.height / 2, 42.1));
car1->setRotation3D(Vec3(90.0f, 0.0f, 0.0f));
car1->setCameraMask((unsigned int)CameraFlag::USER1);
addChild(car1);

可能需要将分辨率改成640*1136,横屏的话角度和辐视差别不大,俯视是没有问题的。

lookAt你没有指定正向方向。用下面的看看

mCamera->lookAt(Vec3(vs.width/2,vs.height*3/5,0),Vec3(0,1,0));

后来我指定了,然后我发现一件很神奇的事情,我用ipad测试时车子能正常显示,用iphone6模拟器的时候又出不来。
还有就是开启了抗锯齿在ipad上显示得比较小的时候模型上有时候还是会有黑缝。