我正在尝试将一个非常复杂的3D建模程序(用C语言编写)移植到webGL。程序有自己的物理引擎从头编写,我想使用物理引擎输出的变换数据作为矩阵来转换webPage中呈现的对象。
该程序非常庞大,我希望将物理引擎保持在C状态,但将图形部分放入浏览器中。
我疯狂的想法是让物理引擎在服务器上不断运行,然后将转换矩阵流式传输到客户端并将转换应用于预渲染的WebGL对象。
这可能吗?
澄清:该程序是一个查看器,因此所有物理后端都与用户输入隔离。但是,用户可以在客户端操纵摄像机角度。
更新:我决定实施以下解决方案,如果有任何错误,请告诉我:我将使用node.js将C程序作为守护程序托管,并使用泵数据前端的websockets - 这是pixi.js(用于2D元素)和babylon.js(或three.js)(用于3D元素)。数据将由JSON对象(四元数或正弦/余弦矩阵)组成,这些对象将在javascript中在前端处理并且每秒应用一次(fps在我的情况下无关紧要,所以没关系)
答案 0 :(得分:0)
推送和弹出矩阵是辅助的(不是渲染管道的核心部分),因此您可以使用自定义堆栈复制它们。
关于整个疯狂的想法:
在交互式物理的情况下,延迟可能是一个问题,您需要在客户端进行某种位置推断。最糟糕的情况是,如果你有多个客户端。想象一下,一个客户端引发了一些物理事件,然后它将数据发送到服务器,服务器将其发送给另一个客户端。因此,您将有效地实现双延迟,并且当您有3个状态(或者如果您有更多客户端时甚至更多)时,将很难解决不一致问题,每个客户端有一个唯一状态,服务器有一个实际状态。延迟越大 - 不一致性越高。物理学对这种不一致性非常敏感,因为它往往会滚雪球。因此,您的客户可能会看到一些奇怪的弹出,存在,远距传物,通过固体物体坠落。
答案 1 :(得分:0)
通过执行以下操作成功实施此操作:
在我的C代码中,我使用hiredis库将一个JSON格式的字符串发布到redis,托管在带有nginx的ec2机器上。接下来,我使用primus(node_module)来设置从redis到node.js应用服务器的订户websocket。 Node然后将数据(无论何时发布)提供给客户端,在那里我解析出JSON并使用该对象绘制我的场景。
此解决方案非常简单快捷,是将大量数据(以JSON对象的形式)推送到许多客户端的非常有效的方法。它还允许在C中设置多个通道(对于不同的数据集),此时您可以在客户端选择要收听的通道(或者立即收听所有通道!)。我使用代码离开了我的计算机,但我可以在以后发布更详细的说明/代码示例。