Javascript P5.js相机不使用多个旋转矩阵

Javascript P5.js相机不使用多个旋转矩阵,javascript,p5.js,Javascript,P5.js,我在p5.js中为游戏和随机项目制作3D第一人称相机已经有一段时间了,但我遇到了一些麻烦 一段时间以来,我一直在我的项目中使用一个y旋转矩阵,以允许玩家四处查看,但最近我想进行升级,所以我决定在我的相机代码中使用x和y旋转矩阵。我能够通过将两个计算出的z值分开,将一个系统搞砸,但存在一些问题,更不用说旋转矩阵不是这样工作的。我最近尝试了一个适当的实现,但遇到了一些问题 我一直在使用这个:camera(0,0,0,-200*sin(rot.y),-200*sin(rot.x),-200*cos(r

我在p5.js中为游戏和随机项目制作3D第一人称相机已经有一段时间了,但我遇到了一些麻烦

一段时间以来,我一直在我的项目中使用一个y旋转矩阵,以允许玩家四处查看,但最近我想进行升级,所以我决定在我的相机代码中使用x和y旋转矩阵。我能够通过将两个计算出的z值分开,将一个系统搞砸,但存在一些问题,更不用说旋转矩阵不是这样工作的。我最近尝试了一个适当的实现,但遇到了一些问题

我一直在使用这个:
camera(0,0,0,-200*sin(rot.y),-200*sin(rot.x),-200*cos(rot.x))+(200*cos(rot.y)),0,1,0作为我的测试相机代码,理论上可以工作,但在实际设置中,由于某些原因,它不能工作,如您所见。现在,如果你环顾四周太远,它会随机喷出,把你的视线弄得一团糟

我还可以确认我使用的公式是正确的。我使用(几乎)完全相同的代码来计算这些值,它看起来非常好


使用p5.js相机有什么奇怪的技巧吗?或者这是一个需要修复的错误吗?

您实际上没有正确的公式。您显示的示例使用的是
orbitControl()
,而不是
camera
。它也没有两个不同的旋转角度

camera()
的中间3个坐标定义了摄影机指向的点。这意味着您希望该点的移动方式与希望摄影机焦点的移动方式相同。在这一点上画一个方框可能会有帮助(在你的原稿中):

push();
翻译(-200*sin(rot.y),-200*sin(rot.x),-200*cos(rot.x))+(200*cos(rot.y));
盒子(50);
pop();
您会注意到,长方体与摄影机的距离并不总是相同的。它停留在一个大半径和小半径都为200的圆环上。你想要的是一个半径为200的球体(实际上它可以有任何半径)

定义这三个坐标的方式取决于您希望用户的交互方式。这里有一个方法:

摄像机(0,0,0,
cos(rot.x)*cos(rot.y),
cos(rot.x)*sin(rot.y),
sin(rot.x),
0, 0, 1);
这将基于纬度和经度指向相机,北极位于正Z轴上。左右移动鼠标会影响经度,上下移动会影响纬度