有人试图实现4d或n维物理实时(或不是)引擎吗?
与3d和2d物理引擎相比,此实现有哪些困难?当然,其中一个是演示问题.看看并了解更多有关4d超球面,超立方体,弹簧,关节,液体和其他物体的信息是一件很有趣的事情.
我只是好奇,没有真正的应用程序使用它.
我的想法的概括是物理在lobachevskian或黎曼几何,畸变空间(你可以穿过针的眼睛),环状空间(回到同一个地方),物理悖论和其他惊人的东西.
我正在编写一个模拟,我们需要一些盒子,当它们在一组传送带上移动时,可以相当准确地建模.目前,我们检测箱子是否与静态输送机表面碰撞,并根据输送机速度应该对每个箱子施加冲动.有没有办法让实际的输送机表面移动并使其环绕或在出料端溶解并从进料端生长?只是使用子弹类和方法的名称才能真正起作用.
游戏或图形行业中的传统物理模拟基本上是离散的.但是现在的引擎如box2d或bullet3d实现了连续物理模拟.我知道离散模拟的基本原理,但我不知道连续模拟.这对我来说是神奇的,使用魔法是艰难而危险的.因此,我希望通过理解它们将魔法变成工具.
所以我想知道:(1)这些连续物理模拟的基本思想和实现原理是什么?(2)这个想法可以推广到其他类型的离散模拟吗?请让我理解这一点!
我有一个封闭的凸多面体,它是由一个凸多边形(面)阵列定义的,这些多边形由三维空间中的顶点数组定义.假设密度均匀,我试图找到多面体的质心.目前我用这个伪代码中的算法计算它.
public Vector3 getCentroid() {
Vector3 centroid = (0, 0, 0);
for (face in faces) {
Vector3 point = face.centroid;
point.multiply(face.area());
centroid.add(point);
}
centroid.divide(faces.size());
return centroid;
}
Run Code Online (Sandbox Code Playgroud)
这基本上取面的质心的加权平均值.我不是100%确定这是正确的,因为我无法在线找到正确的算法.如果有人可以确认我的算法或引用我一个正确的算法我会很感激.
谢谢.
[编辑]
所以这是我用来查找质心的实际Java代码.它将多面体分解为会聚在多面体内任意点上的金字塔.金字塔质心的加权平均值基于以下公式.
C all = SUM 所有金字塔(C 金字塔*体积金字塔)/体积全部
这里是(大量注释的代码):
// Compute the average of the facial centroids.
// This gives an arbitrary point inside the polyhedron.
Vector3 avgPoint = new Vector3(0, 0, 0);
for (int i = 0; i < faces.size(); i++) {
avgPoint.add(faces.get(i).centroid); …Run Code Online (Sandbox Code Playgroud) 我是通过使用维基百科上的基本方程碰撞成对的2D凸对象(无旋转)来计算结果的.但是,当存在依赖关系时,例如两个对象同时命中另一个对象:

例如,在这里,对象1和2在完全相同的时间击中3,成对方法失败.根据我计算碰撞的顺序(先是1-3或先2-3),我会得到不同的结果.通过碰撞的重复迭代仍将给出依赖于顺序的结果.
我已经设置了它,所以我可以弄清楚哪些对象彼此接触,所以我的代码会知道在计算其中一对时,对象3在那一刻与另一个对象发生碰撞(所以1-3碰撞会知道关于2-3碰撞,反之亦然).我也知道边缘/角落与什么接触.
无论什么解决方案都需要健壮...例如,如果设置变得更复杂,就像这两个例子:

这个过程需要能够处理这个问题,甚至更糟.任何可能的同时接触/碰撞链.我将手头上的所有数据描述它们,所以我"只"需要知道如何解决这些系统的一般情况.我目前没有对旋转做任何事情,这简化了事情.
看起来它可能涉及将对象分组在一起,但是由非正交的边缘引起的干扰(参见最后一个带有六边形的示例)似乎会使该方法失败.
我之前看过一个类似的问题,但答案从未被检查过(死胡同?).我不确定冲击传播会如何解决我的第一个例子,因为C在第一次碰撞后就会移开......所以有什么震撼可以传播?编辑:好的,我现在看到同时碰撞和震动传播是两个不同的想法,这就是为什么它看起来没用.
language-agnostic algorithm physics game-physics physics-engine
是否有任何通用物理引擎允许对刚体进行大量模拟?我正在使用来自Nvidia的PhysX,但这个引擎的重点是游戏开发,软体.我想知道是否存在运行在PS3单元处理器或CUDA核心之上的物理引擎,允许进行大规模的科学物理模拟.
我正在用d3.js进入激动人心的强制导向布局世界.我已经掌握了d3的基本原理,但我无法弄清楚建立力导向布局的基本系统.
现在,我正在尝试创建一个简单的布局,其中有几个未连接的气泡浮动到中心.很简单吧!?创建了正确的圆圈,但没有任何反应.
编辑:问题似乎是force.nodes()返回初始数据数组.在工作脚本上,force.nodes()返回一个对象数组.
这是我的代码:
<script>
$(function(){
var width = 600,
height = 400;
var data = [2,5,7,3,4,6,3,6];
//create chart
var chart = d3.select('body').append('svg')
.attr('class','chart')
.attr('width', width)
.attr('height', height);
//create force layout
var force = d3.layout.force()
.gravity(30)
.alpha(.2)
.size([width, height])
.nodes(data)
.links([])
.charge(30)
.start();
//create visuals
var circles = chart.selectAll('.circle')
.data(force.nodes()) //what should I put here???
.enter()
.append('circle')
.attr('class','circles')
.attr('r', function(d) { return d; });
//update locations
force.on("tick", function(e) {
circles.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; …Run Code Online (Sandbox Code Playgroud) 我是物理引擎的新手,但要开始我设想的项目,我需要使六边形在页面中心的固定位置连续旋转。
我想我从根本上误解了物理引擎的工作原理,但是当我调用 Matter.Body.rotate(hexagon, 1); 时 当由提供的参数 (1) 渲染时,它只是立即旋转六边形,并且不会旋转得更远。怎样才能让它连续旋转呢?
这是我的代码:
请注意,设置 setStatic 是为了使六边形不会掉出框架。
// module aliases
var Engine = Matter.Engine,
Render = Matter.Render,
World = Matter.World,
Bodies = Matter.Bodies;
Composites = Matter.Composites;
// create an engine
var engine = Engine.create();
// create a renderer
var render = Render.create({
element: document.body,
engine: engine
});
var hexagon = Bodies.polygon(375, 300, 6, 200, {inertia: Infinity}); // setting inertia to inifinty will prevent rotation upon collision
Matter.Body.setStatic(hexagon, true);
Matter.Body.rotate(hexagon, 1);
console.log(hexagon);
// Matter.Body.rotate(hexagon, 1)
// …Run Code Online (Sandbox Code Playgroud)我有2个刚体(a&b)和1个固定关节约束(带有相对转换rela)。
我的目标是实现:
1 b.transform = a.transform * rela
号。2号。质心(a+ b)不变。
No.3。 (第3牛顿法则)整个系统的速度(a+ b)不变。
No.4。 (第3牛顿法则)整个系统的角速度(a+ b)不变。
否。5 .最小化两个物体的移动/旋转以解决问题。
我希望对两个物体施加冲击/扭矩,以使它们逐渐满足要求。
这部影片可以描绘出我想要的-(youtube链接)。
如何解决适用于每个身体的冲动/扭矩值?
我想要一个大概的主意/算法。
它可以是没有任何代码的描述文本。
这是一个示例问题及其正确的解决方案(即最终的静止状态):
这是我当前的代码段,以防万一:
class Transform {
Vec3 pos;
Matrix33 basis;
};
Run Code Online (Sandbox Code Playgroud)
每个刚体具有以下领域:
class RigidBody {
float mass;
Matrix33 inertiaTensor;
Transform transform;
Vec3 velocity;
Vec3 angularVelocity;
};
Run Code Online (Sandbox Code Playgroud)
该修复关节约束是: -
class FixConstraint {
Transform …Run Code Online (Sandbox Code Playgroud) 这是一个例子(见图):
到目前为止,我设法获得了所有有用的信息。让我们将其视为输入:
A和球之间的穿透力,我可以按Vec3(1,0,0) OR键 移动球Vec3(0,2,0)。 B和球之间的穿透问题,我可以移动球Vec3(0,1,0)。 ^我将其存储为2D Vec3数组problem = {{Vec3{1,0,0},Vec3{0,2,0}},{Vec3{0,1,0}}}。
如何找到物理对象(例如示例中的球)的最佳运动(最小尺寸),以最大程度地减少穿透力?
在此示例中,最佳解决方案是“将球移动Vec3(1,1,0):size = 1.414”。
在实际情况下,情况可能会更加复杂和丑陋,
例如,A&B(和其他物理对象)都可能试图将球推向接近相反的方向。(下图)
^在某些场景中,二维数组problem可能缺少一些细节,但为简单起见,我们假设它可以准确地解释所有信息。
这是我的MCVE(coliru):
#include<iostream>
#include <utility>
#include <vector>
#include <array>
#include <math.h>
using Vec3=std::array<float, 3>;
float dotProduct(Vec3 vec1,Vec3 vec2){
return vec1[0]*vec2[0]+vec1[1]*vec2[1]+vec1[2]*vec2[2];
}
float size2(Vec3 vec1){
return vec1[0]*vec1[0]+vec1[1]*vec1[1]+vec1[2]*vec1[2];
}
Vec3 mulFloat(Vec3 vec1,float m){
return Vec3{vec1[0]*m,vec1[1]*m,vec1[2]*m};
}
Vec3 normalize(Vec3 vec1){
return mulFloat(vec1,1/sqrt(size2(vec1)));
}
Run Code Online (Sandbox Code Playgroud)
这是main():- …
c++ language-agnostic algorithm mathematical-optimization physics-engine
physics-engine ×10
algorithm ×3
game-physics ×3
physics ×3
javascript ×2
math ×2
bullet ×1
c++ ×1
constraints ×1
continuous ×1
d3.js ×1
force-layout ×1
geometry ×1
java ×1
matter.js ×1
principal ×1
rotation ×1
simulation ×1