为了在刚体模拟中使用,我想计算质量和惯性张量(惯性矩),给定一个三角形网格表示(不一定是凸起的)对象的边界,并假设内部的密度恒定.
我需要用C ++编写一个函数,该函数可以对在3D空间中移动的对象的轨迹曲线进行建模和采样。
该函数将需要接受3个参数作为输入。函数原型可能看起来像这样:
void CalculateAndSampleTrajectory(Vec3 direction, float impulse, float mass)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
该VEC3方向是一个结构。本质上是3个浮点,它们表现为描述脉冲初始角度的单位矢量。
该浮冲动是冲动是多么强大的幅度。
该浮动质量描述投影的物体的质量。
该函数将采用这3个参数,然后在给定瞬时脉冲的情况下,沿着此向量射击,预先计算该质量的对象的轨迹。
为此,它将在飞行的前4秒钟内对轨迹进行采样(例如200个)。这些样本将是弹丸位置的Vec3,并存储在阵列中。
所有单位均为SI,重力加速度为9.81。我们不会考虑任何空气阻力。
这个问题涉及很多物理学,特别是经典力学。这不是我的强项,但我对发生的事情有基本的了解。
我知道我将需要物体的速度,我认为可以将其计算为:
Vec3 velocity = (direction * impulse)/mass;
Run Code Online (Sandbox Code Playgroud)
我觉得这个作品,因为我的冲动将被立即应用,所以这将是F = MA重新安排找到一个但作为3D矢量的。老实说,我什至不确定这是否正确,但我认为是正确的。
一旦有了速度,我就知道可以使用在线上提供的大量方程式了,例如有关弹道的Wikipedia文章
我不太擅长将这些方程式解释为C ++。
在设置了适当的方程式之后,我将需要在4秒钟内进行200个采样。这可以循环执行:
for(int i = 0; i < 200; i++)
{
int t = 0;
//sample equation with t
//store resulting vec3 pos in array
t = t + 0.02;
}
Run Code Online (Sandbox Code Playgroud)
我在t的 …
我有一个程序,圆圈可以互相反弹.我按照这里的指示旋转矢量并根据碰撞角度缩放幅度:http://www.vobarian.com/collisions/2dcollisions2.pdf
我在python中编写了这段代码(0索引表示x坐标):
norm_vect = [(object2.pos[0] - object1.pos[0]), (object2.pos[1] - object1.pos[1])]
unit = sqrt((norm_vect[0]**2) + (norm_vect[1]**2))
unit_vect = [float(norm_vect[0]) / unit, float(norm_vect[1]) /unit]
tan_vect = [-unit_vect[1], unit_vect[0]]
vel1 = object1.vel
vel2 = object2.vel
vel1_norm = vel1[0] * unit_vect[0] + vel1[1] * unit_vect[1]
vel1_tan = vel1[0] * tan_vect[0] + vel1[1] * tan_vect[1]
vel2_norm = vel2[0] * unit_vect[0] + vel2[1] * unit_vect[1]
vel2_tan = vel2[0] * tan_vect[0] + vel2[1] * tan_vect[1]
new_vel1_norm = (vel1_norm * (object1.mass - object2.mass) + 2 …Run Code Online (Sandbox Code Playgroud) 如何获得SCNPhyisicsBody的当前速度?
velocity属性总是返回(0.0,0.0,0.0),而我的SCNNode的prensetationNode的physicsBody也是nil.
我正在用html画布构建一个游戏.这是一个空气曲棍球比赛,我已经相当远了.游戏中有三个圆圈,被击中的圆盘和两个控制器(用于击中圆盘/圆圈).
我已经让光盘从墙壁上反弹,并具有检测光盘何时与控制器发生碰撞的功能.我正在努力的一点是当两个圆圈碰撞时,控制器应保持静止,光盘应朝正确的方向移开.我读了很多文章,但仍然无法做到.
这是Codepen链接到目前为止我的进展.你可以看到冰球从控制器上反弹但没有朝着正确的方向反弹.你还会看到冰球是否来自控制器后面的冰球. http://codepen.io/allanpope/pen/a01ddb29cbdecef58197c2e829993284?editors=001
我认为我所追求的是弹性碰撞但不确定如何解决它.我发现这篇文章却无法让它发挥作用.
Heres是我的碰撞检测功能.自我引用光盘,控制器[i]是光盘命中的控制器.
this.discCollision = function() {
for (var i = 0; i < controllers.length; i++) {
// Minus the x pos of one disc from the x pos of the other disc
var distanceX = self.x - controllers[i].x,
// Minus the y pos of one disc from the y pos of the other disc
distanceY = self.y - controllers[i].y,
// Multiply each of the distances by itself
// Squareroot that number, which gives you the …Run Code Online (Sandbox Code Playgroud) 这是对社区的一个呼吁,看看是否有人有想法提高这个MSD计算实施的速度.它主要基于此博客文章的实现:http://damcb.com/mean-square-disp.html
目前,对于500个点的2D轨迹,当前实施需要大约9秒.如果你需要计算很多轨迹,这真的太过分了......
我没有尝试并行化(使用multiprocess或者joblib),但我觉得创建新进程对于这种算法来说太重了.
这是代码:
import os
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Parameters
N = 5000
max_time = 100
dt = max_time / N
# Generate 2D brownian motion
t = np.linspace(0, max_time, N)
xy = np.cumsum(np.random.choice([-1, 0, 1], size=(N, 2)), axis=0)
traj = pd.DataFrame({'t': t, 'x': xy[:,0], 'y': xy[:,1]})
print(traj.head())
# Draw motion
ax = traj.plot(x='x', y='y', alpha=0.6, legend=False)
# Set limits
ax.set_xlim(traj['x'].min(), …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用C在opengl中建立太阳系的模拟.我似乎无法弄清楚如何编写用于计算另一个行星施加在行星上的力的方向的代码.这就是我到目前为止:
void attraction(planet self, planet other, float *direction)
{
float d = vecDistance(self.p, other.p);
//calc the force of attraction
float f = G * ((self.mass * other.mass) / (pow(d, 2)));
//calc the direction of the force
float vectorDist[3];
vecSub(self.p, other.p, vectorDist);
direction[0] = f*vectorDist[0] / d;
direction[1] = f*vectorDist[1] / d;
direction[2] = f*vectorDist[2] / d;
}
float vecDistance( float *pV1, float *pV2 )
{
float fLen=0.0f;
if(pV1 && pV2)
{
float av[3];
vecSub(pV2, pV1, av);
fLen=vecLength(av);
}
return fLen; …Run Code Online (Sandbox Code Playgroud) 我正在使用Google Cardboard SDK整理应用程序.用户可以在有或没有纸板的情况下使用该应用程序.因此,应用程序内部有一个切换按钮,用于激活和停用立体渲染.
该应用程序还使用Vuforia SDK来跟踪图像目标.如果识别出特定目标,则目标上方的一些3D对象和粒子系统开始发射粒子.
在非立体声模式下一切正常.粒子按预期正确发射和下落.他们应该模拟雪.此外,如果用户将图像目标转到一个角度,则上面的3D对象会掉下来.
当切换到立体声模式时,物理学完全搞砸了.雪粒不再下降,它们似乎在屏幕周围"传送".此外,3D物体确实向上倾斜,具有非常重的负重力.时间尺度似乎成倍增加,但不是 - 我仔细检查过.在非立体和立体渲染之间切换时,重力也不会改变.
在蛾模式下,Unity Editor中的一切工作正常.它只出现在iPhone 5的设备上.
我仔细检查了重力和时间刻度,它们在模式之间切换时没有变化.我很难搞清楚可能导致物理问题陷入困境的原因.
我做了一些进一步的调查.我让我在相机前坐着一个小小的小发明,但是获得了Unity世界空间轴的旋转,所以我知道3D世界是相对于相机的.事实证明,当使用谷歌纸板相机系统处于VR模式时,世界确实在相机上大量旋转.我设法以某种方式拿着测试设备,所以它正在减速并且几乎冻结,但我还没有解释效果.
physics unity-game-engine particle-system vuforia google-cardboard
大家好:)这是情况:
我有一个baddy预制件,它有两个碰撞器组件:一个用于物理的简单CapsuleCollider2D,以及一个仅用于鼠标点碰撞的触发器PolygonCollider2D.
PolygonCollider2D仅在需要时通过附加脚本(Baddy.cs)更新:
if(this.gameObject.GetComponent<PolygonCollider2D>()!=null){
Destroy(this.gameObject.GetComponent<PolygonCollider2D>());
}
this.gameObject.AddComponent<PolygonCollider2D>();
this.gameObject.GetComponent<PolygonCollider2D>().isTrigger=true;
Run Code Online (Sandbox Code Playgroud)
是的,这是不好的做法,但它完成了工作.它完美地工作:在游戏的场景视图中我可以暂停并看到我们的baddy预制件上确实存在多边形对撞机.
在另一个附加脚本(CollisionHandler.cs)中,我们检查我们的baddy上的鼠标按下:
if(MousePress()){
hit=Physics2D.Raycast(level.mousePoint, Vector2.zero, 0f);
if(hit&&hit.collider==this.gameObject.GetComponent<PolygonCollider2D>()){
print("baddy mousePress");
}
}
Run Code Online (Sandbox Code Playgroud)
然而hit.collider==this.gameObject.GetComponent<PolygonCollider2D>()结果是错误的,即使我可以打印两个hit.collider并且this.gameObject.GetComponent<PolygonCollider2D>()在我们之前立即打印if(MousePress())并将它们定义为:
D_Prefab(Clone) (UnityEngine.PolygonCollider2D)
Run Code Online (Sandbox Code Playgroud)
它们不能是不同的PolygonColliders,因为一次只能有一个,因为我们的Baddy脚本同时删除并创建了PolygonCollider.
什么想法可能会出错?
出于好奇,我用3种方式实现了vector3实用程序:array(带有typedef),类和结构
这是数组实现:
typedef float newVector3[3];
namespace vec3{
void add(const newVector3& first, const newVector3& second, newVector3& out_newVector3);
void subtract(const newVector3& first, const newVector3& second, newVector3& out_newVector3);
void dot(const newVector3& first, const newVector3& second, float& out_result);
void cross(const newVector3& first, const newVector3& second, newVector3& out_newVector3);
}
// implementations, nothing fancy...really
void add(const newVector3& first, const newVector3& second, newVector3& out_newVector3)
{
out_newVector3[0] = first[0] + second[0];
out_newVector3[1] = first[1] + second[1];
out_newVector3[2] = first[2] + second[2];
}
void subtract(const newVector3& first, const newVector3& …Run Code Online (Sandbox Code Playgroud) physics ×10
c++ ×2
math ×2
3d ×1
bounce ×1
c ×1
c# ×1
canvas ×1
collision ×1
debugging ×1
game-physics ×1
javascript ×1
numpy ×1
objective-c ×1
optimization ×1
pandas ×1
performance ×1
projectile ×1
python ×1
python-3.x ×1
rigid-bodies ×1
scenekit ×1
swift ×1
unity5 ×1
utility ×1
vuforia ×1
xcode ×1