小编Adr*_*ddy的帖子

从矩阵获得俯仰和滚动而没有奇点

我正在研究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/

据我了解,这里有两个问题.

  1. 模拟器上没有偏航轴.
  2. 即使有偏航轴,电机也不会像计算机图形那样,即它们需要时间才能达到目标位置.

我已经读过关于万向节锁甚至实现了euler过滤器,但是没有按预期工作.关于万向节锁的大多数建议是使用四元数,但我不能用四元数驱动物理运动(或者我可以?).

轴顺序在这里并不重要,因为更改它只会将奇点从一个轴移动到另一个轴.

我需要以其他方式处理这个问题.

我尝试用矩阵乘以轴向量,然后使用十字和点积来获得角度,但这也失败了.我认为还应该进行轴重投,以实现这一目标,但我无法弄明白.但有些事情告诉我,这是正确的方法.它是这样的:http://jsfiddle.net/qajro0ny/53/

然后我提出了不同的想法.我知道以前的位置,所以可能会做以下事情:

  1. 将矩阵转换为四元数
  2. 计算当前和之前四元数之间的差异
  3. 将生成的四元数转换为欧拉角
  4. 将这些角度添加到静态俯仰,滚动和偏航变量.

所以我试过了......它奏效了!在任何方向上都没有奇点,在俯仰,滚转和偏航方面完美的360度旋转.完美的解决方案!除了......它不是.帧没有同步,所以经过一段时间的角度远离他们应该是什么.我一直在考虑某种同步机制,但我认为这不是正确的方法.

它看起来像这样:http://jsfiddle.net/qajro0ny/52/

和相同的逻辑,但直接与矩阵:http://jsfiddle.net/qajro0ny/54/

我搜索了网页的高低,我已经阅读了几十篇论文和其他问题/帖子,我简直无法相信没有什么能真正起作用.

我可能不理解或遗漏某些东西,所以这里是我发现和尝试的一切:

链接:http://pastebin.com/3G0dYLvu

代码:http://pastebin.com/PiZKwE2t(我把它们放在一起,所以它很乱)

我一定是错过了什么,或者我是从错误的角度看这个.

c++ math 3d matrix euler-angles

24
推荐指数
1
解决办法
1939
查看次数

QTcpServer速度慢,同时拥有大量客户端

我在Qt中编写TCP服务器,它将提供大文件.应用逻辑如下:

  1. 我已经将QTcpServer子类化并重新实现了incomingConnection(int)
  2. 在incomingConnection中,我正在创建"Streamer"类的实例
  3. "Streamer"正在使用QTcpSocket,它使用来自incomingConnection的setSocketDescriptor进行初始化
  4. 当来自客户端的数据到达时,我从readyRead()槽中发回初始响应,然后我将socket的信号bytesWritten(qint64)连接到Streamer的槽bytesWritten()

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的事件调度(或套接字通知?)太慢,无法处理所有这些事件.

我试过了:

  1. 使用-O3编译整个Qt和我的应用程序
  2. 安装libglib2.0-dev并重新编译Qt(因为QCoreApplication使用QEventDispatcherGlib或QEventDispatcherUNIX,所以我想看看是否有任何区别)
  3. 使用streamer-> moveToThread()产生几个线程并在incomingConnection(int)中,取决于当前特定线程的客户端数量 - 没有做任何更改(尽管我观察到速度变化更大)
  4. 产卵工人使用过程

码:

main.cpp:
#include <sched.h>

int startWorker(void …
Run Code Online (Sandbox Code Playgroud)

c++ performance qt qtcpserver

5
推荐指数
1
解决办法
1819
查看次数

标签 统计

c++ ×2

3d ×1

euler-angles ×1

math ×1

matrix ×1

performance ×1

qt ×1

qtcpserver ×1