我有兴趣做一个"太阳系"模拟器,它可以让我模拟行星和恒星的旋转和重力.
我想能够说,模拟我们的太阳系,并以不同的速度模拟它(即,观察地球和其他行星在太阳,几年等周围绕太阳旋转).我希望能够添加行星并改变行星质量等,以了解它将如何影响系统.
有没有人有任何资源可以指出我正确的方向来编写这种模拟器?
是否有为此目的设计的现有物理引擎?
我正在尝试将明星的BV颜色索引转换为明显的RGB颜色.除了查找表格和颜色渐变之外,似乎没有众所周知的算法可以做到这一点.
这是天文学家为一颗恒星指定其明显颜色的数字.热星(低BV)是蓝色/紫色,冷色星(高BV)是红色的,其间有白色/橙色星.

var t = 4600 * ((1 / ((0.92 * bv) + 1.7)) +(1 / ((0.92 * bv) + 0.62)) );
Run Code Online (Sandbox Code Playgroud)
如果将星型建模为黑体,则可以使用普朗克轨迹的数值近似来计算xy坐标(CIE色度)



// t to xyY
var x, y = 0;
if (t>=1667 && t<=4000) {
x = ((-0.2661239 * Math.pow(10,9)) / Math.pow(t,3)) + ((-0.2343580 * Math.pow(10,6)) / Math.pow(t,2)) + ((0.8776956 * Math.pow(10,3)) / t) + 0.179910;
} else if (t > 4000 && t <= 25000) {
x = ((-3.0258469 …Run Code Online (Sandbox Code Playgroud) 在过去的几天里,我一直试图让Three.js纹理化.我遇到的问题是我的浏览器阻止纹理加载,这是通过遵循这里的说明解决的.
无论如何,我正在为我的一个班级制作一个太空导航游戏,演示如何在太空中航行太空船.所以,我渲染了一堆行星,地球就是其中之一.我在下面列出了我的地球渲染图片.它看起来没问题,但我想做的是通过在地球周围添加"氛围"使其看起来更逼真.
我环顾四周,并且发现了一些看起来非常整洁的创意来处理发光,但我不认为它们适用于我的情况.
这里的代码将地球添加到我的场景中(这是我从Three.js教程获得的代码的修改版本):
function addEarth(x,y){
var sphereMaterial =
new THREE.MeshLambertMaterial({
//color: 0x0000ff,
map: earthTexture
});
// set up the sphere vars
var radius = 75;
segments = 16;
rings = 16;
// create a new mesh with
// sphere geometry - we will cover
// the sphereMaterial next!
earth = new THREE.Mesh(
new THREE.SphereGeometry(
radius,
segments,
rings),
sphereMaterial);
earth.position.x = x;
earth.position.y = y;
// add the sphere to the scene
scene.add(earth);
}
Run Code Online (Sandbox Code Playgroud)

Celestia是一个用于空间实时三维可视化的华丽应用程序,具有太阳系的详细模型,超过100,000颗恒星,超过10,000个星系,以及用于添加更多物体的扩展机制.
它可以运行在windows,mac os,linux,freeBSD上,然后是否有任何Android端口呢?或者如何构建或移植到Android?
在3D游戏中渲染具有固定纹理的天空时,人们通常首先在立方体贴图中创建6个纹理,然后在相机周围渲染立方体.在GLSL中,您可以使用法线而不是纹理坐标访问纹理中的像素,并且可以通过相对于相机标注片段位置来轻松获得此法线.但是,此过程可以使用围绕相机的任何形状来完成,因为当您对每个位置进行标准化时,它将始终产生一个球体.现在我想知道:为什么它总是一个立方体而不是四面体?渲染一个立方体需要12个三角形,一个四面体只有4个.正如我已经说过的,围绕相机的任何形状都可以工作.因此,四面体占用较少的VRAM并且渲染速度更快,没有任何缺点?为什么不使用它们?
在3d空间中有行星和一些卫星.我需要计算每颗卫星的旋转轴.它们应围绕行星中心旋转.
我计算了从卫星到地球中心的矢量.
vec1 = planetCenter - sputnikCenter;
Run Code Online (Sandbox Code Playgroud)
使用vec1和planetCenter,我可以计算垂直于vec1的平面方程.
等式:
A.x + B.y + C.z + D = 0
Run Code Online (Sandbox Code Playgroud)
现在,我应该在这架飞机上得到随机矢量.该向量将是旋转轴.但是我怎么能得到这个随机向量?
我试图解决开普勒方程,作为在给定时间内找到轨道体的真实异常的一个步骤.事实证明,开普勒的方程很难解决,维基百科页面使用微积分描述了这个过程.好吧,我不知道微积分,但我知道解决方程涉及无数个集合,这些集合产生了与正确答案越来越接近的近似值.
我无法从数学上看到如何计算这个,所以我希望有更好数学背景的人可以帮助我.我怎么能在计算上解决这个野兽?
FWIW,我正在使用F# - 我可以计算出这个等式所需的其他元素,只是这部分我遇到了麻烦.
我也对接近时间,近点距离和离心率的真实异常的方法持开放态度
我想用WebGL从低轨道(这里约300公里)建立一个逼真的地球视图.也就是说,在网络上,它具有所暗示的一切,而且在移动设备上.不要在这里停止阅读:为了减少这一点,用户可以到处看,但不能平移,所以视图只涉及3000km宽的小区域.但是这个视图跟随一颗卫星几分钟后,用户回到原来的状态,地球的旋转稍微移动等等.所以云不能一直在同一个地方.
我实际上已经能够包括城市的灯光,极光,闪电......除了云.我已经看到很多实时渲染热情和研究人员的演示,但他们都没有一个漂亮,逼真的云层.但是我确信我是第100个想到这样做的人,所以请高兴我.
提出的问题很少:
以下是总结我尚未看到的一些想法,按重要性排序:
云隐藏了60%的地球.
云散射城市和闪电的灯光,晚上有瑞利散射.
在这个距离处,视差效果是可见的,甚至在最小的云层中也非常棒.
据我所见,即使是昂贵的实时气象在线资源也没用:它们在紫外线和红外线光波的帮助下瞄准下雨或暴风雨的云层,因此它们不会100%捕获它们并且不会给出正常的"我们都知道.此外,在可见光下拍摄的罕见的良好云纹理几乎不能将地面与云层区分开来:有时长达5000公里的海岸无处不在.服务器可能能够使用这些图像来创建更好的纹理.
当我看到那些图片时,我想最好的方法是从包含不同模型的数据库中合并几个漂亮的云网格,然后在用户经过时稍微转换着色器内的网格.如果他回来后90分钟仍然在这里,无论模特是否再次相同.然而,飓风不能消失.
你怎么看待这件事 ?
用例是为数字合成生成正弦波,因此,我们需要计算sin(dt)的所有值,其中:
t是整数,表示样本编号.这是可变的.对于CD质量的一小时声音,范围从0到158,760,000.
d是double,表示角度的增量.这是不变的.范围是:大于0,小于pi.
目标是使用传统的int和double数据类型实现高精度.表现并不重要.
天真的实施是:
double next()
{
t++;
return sin( ((double) t) * (d) );
}
Run Code Online (Sandbox Code Playgroud)
但是,问题是当t增加时,精度会降低,因为大数字提供给"罪"功能.
改进版本如下:
double next()
{
d_sum += d;
if (d_sum >= (M_PI*2)) d_sum -= (M_PI*2);
return sin(d_sum);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我确保提供从0到2*pi到"sin"函数的数字.
但是,现在问题是当d很小时,会有许多小的增加,每次都会降低精度.
这里的问题是如何提高准确性.
附录1
"准确性降低,因为大数字提供给"罪"功能":
#include <stdio.h>
#include <math.h>
#define TEST (300000006.7846112)
#define TEST_MOD (0.0463259891528704262050786960234519968548937998410258872449766)
#define SIN_TEST (0.0463094209176730795999323058165987662490610492247070175523420)
int main()
{
double a = sin(TEST);
double b = sin(TEST_MOD);
printf("a=%0.20f \n" , a);
printf("diff=%0.20f \n" …Run Code Online (Sandbox Code Playgroud) 我有一个场景,我正在绘制(按比例)地球、月球和一些航天器。当月球被地球遮挡时,它不会消失,而是仍然可见(通过地球)。
从我的研究我发现问题的一部分是我的相机的近距设置太小了,如链接文章中所述,z 排序中近因舍入的小值无法处理非常远的物体。
这里的复杂性是,当相机放大时,我需要有细粒度的 z 索引,以查看航天器(与地球相比,半径最多为 61 米的物体,重量为 r =~ 6.5e+06 meters)。为了使月球和地球规模的物体以正确的顺序呈现,近处必须至少为 100,000 米,此时我无法看近处的物体。
一种解决方案是缩小比例以使用公里,但我不能失去这种精度,并且更喜欢使用米。
关于如何在正确的 z 索引处渲染非常大的远距离物体,同时保留缩放比例和放大小物体的能力的任何想法?
我的想法(我不知道如何实施):