我正在研究2自由度(俯仰和滚动)的运动模拟器.我正在从游戏中读取变换矩阵,我需要获得角度并发送到硬件来驱动电机.由于欧拉角有奇点,我不能真正使用它们.它的行为如下:

什么时候应该这样:

我准备了在线示例以更好地显示问题:
// Get euler angles from model matrix
var mat = model.matrix;
mat.transpose();
var e = new THREE.Euler();
e.setFromRotationMatrix(mat, 'XZY');
var v = e.toVector3();
var pitch = -v.z;
var roll = -v.x;
Run Code Online (Sandbox Code Playgroud)
http://jsfiddle.net/qajro0ny/3/
据我了解,这里有两个问题.
我已经读过关于万向节锁甚至实现了euler过滤器,但是没有按预期工作.关于万向节锁的大多数建议是使用四元数,但我不能用四元数驱动物理运动(或者我可以?).
轴顺序在这里并不重要,因为更改它只会将奇点从一个轴移动到另一个轴.
我需要以其他方式处理这个问题.
我尝试用矩阵乘以轴向量,然后使用十字和点积来获得角度,但这也失败了.我认为还应该进行轴重投,以实现这一目标,但我无法弄明白.但有些事情告诉我,这是正确的方法.它是这样的:http://jsfiddle.net/qajro0ny/53/
然后我提出了不同的想法.我知道以前的位置,所以可能会做以下事情:
所以我试过了......它奏效了!在任何方向上都没有奇点,在俯仰,滚转和偏航方面完美的360度旋转.完美的解决方案!除了......它不是.帧没有同步,所以经过一段时间的角度远离他们应该是什么.我一直在考虑某种同步机制,但我认为这不是正确的方法.
它看起来像这样:http://jsfiddle.net/qajro0ny/52/
和相同的逻辑,但直接与矩阵:http://jsfiddle.net/qajro0ny/54/
我搜索了网页的高低,我已经阅读了几十篇论文和其他问题/帖子,我简直无法相信没有什么能真正起作用.
我可能不理解或遗漏某些东西,所以这里是我发现和尝试的一切:
链接:http://pastebin.com/3G0dYLvu
代码:http://pastebin.com/PiZKwE2t(我把它们放在一起,所以它很乱)
我一定是错过了什么,或者我是从错误的角度看这个.
我在Qt中编写TCP服务器,它将提供大文件.应用逻辑如下:
bytesWritten看起来像:
Streamer.h:
...
private:
QFile *m_file;
char m_readBuffer[64 * 1024];
QTcpSocket *m_socket;
...
Streamer.cpp
...
void Streamer::bytesWritten() {
if (m_socket->bytesToWrite() <= 0) {
const int bytesRead = m_file->read(m_readBuffer, 64 * 1024);
m_socket->write(m_readBuffer, bytesRead);
}
}
...
Run Code Online (Sandbox Code Playgroud)
所以基本上我只是在完全写入所有待处理数据时才写入新数据.我认为这是最不同步的方式.
一切都正常,但是当有很多同时发生的客户时它很慢.
有大约5个客户端 - 我从该服务器下载速度大约1 MB/s(最大的家庭互联网连接)
约有140个客户端 - 下载速度约为100-200 KB/s.
服务器的互联网连接速度为10 Gbps,140个客户端的使用速度约为100 Mbps,因此我不认为这是问题所在.
服务器的内存使用量为140个客户端 - 100 MB的2GB可用
服务器的CPU使用率 - 最大20%
我正在使用端口800.
当端口800上有140个客户端并且通过它的下载速度就像是100-200 KB/s时,我在端口801上运行单独的副本,并且以1 MB/s的速度下载没有问题.
我的猜测是,不知何故,Qt的事件调度(或套接字通知?)太慢,无法处理所有这些事件.
我试过了:
码:
main.cpp:
#include <sched.h>
int startWorker(void …Run Code Online (Sandbox Code Playgroud)