我建立某种行星系统的three.js所和我花了几个小时寻找一个体面的解决方案,以获得一个外发光的一个星球-与纹理的球体对象.
我遇到了这个例子http://stemkoski.github.io/Three.js/Selective-Glow.html哪种做法,但问题是 - 这种形式的发光也影响主要的3D对象,导致颜色变化(如那里所见).
另一个不错的发光示例可以在http://bkcore.com/blog/3d/webgl-three-js-animated-selective-glow.html找到,但它再次发光整个区域,而不仅仅是"外部"的东西.
我一直在GitHub上阅读一些关于"overrideMaterial"属性的讨论主题,但这似乎是实验性的,未使用的和未记录的......甚至不确定这是否可以解决我的问题.
请分享您的想法,谢谢!
我正在尝试将明星的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) 我有一个每10秒绕一圈旋转的圆圈.我正在尝试投射一个朝向轨道原点(光源)倾斜的阴影,同时还要考虑相机角度.
阴影适用于某些角度,但随着相机越来越倾斜或更多自上而下,它开始看起来不那么准确,我不知道如何纠正它 - 这似乎是一个复杂的数学问题,我正在努力弄清楚怎么解决.
这是动画:http://jsfiddle.net/8y2bm88w/
我为阴影绘制代码:
ctx.beginPath();
//rotate shadow with the planet
ctx.translate(originX + obj[i].x, originY + obj[i].y);
ctx.rotate(obj[i].angle); //rotate around origin
ctx.translate(-(originX + obj[i].x), -(originY + obj[i].y));
var offsetX = -(10 * Math.sin(obj[0].angle)); //i feel this is the issue
var offsetY = 0; //this too
ctx.rect(originX + obj[i].x + offsetX, originY + obj[i].y + offsetY - 10, 20, 20);
ctx.fillStyle = 'rgba(213,0,0,0.9)'; //red shadow - easier to see
ctx.fill();
Run Code Online (Sandbox Code Playgroud)
代码通过JSFiddle更有意义,因为它将代码放入更多上下文中.
所以我认为这与数学offsetX和offsetY变量有关,因为用户改变了摄像机角度,偏移量需要适应和改变阴影移动的方式.但是,这真的让人困惑如何解决.
正如其他人所讨论的那样,GLSL缺乏任何类型的printf调试.但有时我真的想在调试着色器时检查数值.
我一直在尝试创建一个可视化调试工具.我发现如果使用sampler2D其中数字0123456789已经在等宽度中渲染的数据,可以在着色器中相当容易地渲染任意数字系列.基本上,你只是玩弄你的x坐标.
现在,要使用它来检查浮点数,我需要一个算法将a转换float
为十进制数字序列,例如您可能在任何printf实现中找到.不幸的是,据我所知这个主题,这些算法似乎需要以更高精度的格式重新表示浮点数,我不知道这似乎有可能在GLSL中我似乎有只有32位float可用.出于这个原因,我认为这个问题不是任何一般的"printf如何工作"问题的重复,而是具体关于如何使这些算法在GLSL的约束下工作.我已经看到了这个问题和答案,但不知道那里发生了什么.
我尝试过的算法并不是很好.我的第一次尝试,标记为版本A(注释掉)似乎非常糟糕:采取三个随机的例子,RenderDecimal(1.0)渲染为1.099999702,RenderDecimal(2.5)给了我,
2.599999246然后RenderDecimal(2.6)出来了2.699999280.我的第二次尝试,标志着版本B,似乎略胜一筹:1.0与2.6两者出来罚款,但RenderDecimal(2.5)仍然不匹配的一个明显的凑整5的事实,剩余的是0.099....结果显示为2.599000022.
我的最小/完整/可验证的例子,下面,从一些简短的GLSL 1.20代码开始,然后我碰巧选择了Python 2.x,只是为了编译着色器并加载和渲染纹理.它需要pygame,numpy,PyOpenGL和PIL第三方软件包.请注意,Python实际上只是样板,并且可以通过C或其他任何东西重写(尽管繁琐).只有顶部的GLSL代码对于这个问题至关重要,因此我不认为这些python或python 2.x标签会有所帮助.
它需要将以下图像保存为digits.png:

vertexShaderSource = """\
varying vec2 vFragCoordinate;
void main(void)
{
vFragCoordinate = gl_Vertex.xy;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
"""
fragmentShaderSource = """\
varying vec2 vFragCoordinate;
uniform …Run Code Online (Sandbox Code Playgroud) 重要提示:这个问题与"PhysX" 完全没有关系,"PhysX"是一个计算机游戏物理系统(对于街机游戏中的物理学有用,如球类游戏等); PhysX是Unity3D和其他游戏引擎内置的系统; PhysX在这里完全无关紧要.
////////////////////更新(先读到底部)/////////////////////
我一直在记录值并搜索确切问题的位置,我想我找到了它.我的代码中有这样的东西
Velocity += Acceleration * Time.deltaTime;
position += Velocity * Time.deltaTime;
Run Code Online (Sandbox Code Playgroud)
加速度就像0,0000000000000009 ..现在.当代码流动时,速度应该增加,浮动没有问题.但是在开始时,地球的初始位置是(0,0,23500f)你可以在我最后给出的图表中看到这一点.
那么现在当我将速度*timedelta(此时类似于0,00000000000000005)添加到23500的位置时,它基本上不会添加它.位置仍然是(0,0,23500)不像(0,0,23500.00000000000005),因此地球不移动,因此加速度不会改变.
如果我将地球的初始位置设置为0,0,0并且仍然将加速度设置为0.0000000000000000009以使其位置为(0,0,23500)然后"ADDS"速度*timedelta.它变得类似于(0,0,000000000000000000005)并且继续增加.当float为0时,添加这么小的值没有问题.但是如果浮点数类似于23500,那么它就不会增加小值.
我不知道这是完全统一的问题还是c#的漂浮.
这就是为什么我不能让它与小值一起工作.如果我能克服这一点,我的问题将得到解决.
////////////////////////////////////////////////// /////////////////////////////
我一直在开发n体植物以模拟我们的太阳系,因此我一直在收集数据以使其尽可能逼真.但是数据大小存在问题.我搜索了每一点互联网,我找不到人们如何克服这一点的单一解释.(如果是这样的话)所以我在这里尝试拍摄.
因此,为了保持行星之间的距离,半径和"质量"的比例,我创建了一个excel文件来计算所有数据.(因为有人为什么会把"地球的质量如果有"那个"半径图"在互联网上?)我将把ss作为附件.它基本上"标准化"或换句话说"缩放"行星的每个属性到给定的参考.在这种情况下,我把参考作为"地球的半径".
我团结一致,你知道,你不能在统一中使用"太大"或"太小"的价值观.所以我不得不缩小太阳能系统,"很多!"
因此,我使用牛顿万有引力定律,即F = GMm/r ^ 2,使其变得简单,我直接计算a = GM/r ^ 2,对于来自所有其他物体的给定物体.
因此,地球的"朝向太阳"的重力加速度的实际值大约是0,000006 km/s ^ 2,这在统一的工作中甚至是非常小的值,但它可以工作.然而,为了获得这个值,1我需要将地球的半径(比例)设置为6371单位,并将太阳比例设置为696,342 !,这对于将其统一起来来说太大了.
所以我说,让地球的半径为1,以统一为单位.因此,当半径改变时,一切都会改变,质量,距离......我保持行星的密度,并用新半径计算新体积的质量.所有计算都在附件中.
所以事实是,当我把地球的半径变为1时,对太阳的引力加速就像0,0000000000009那样小得可笑.当然,Unity不会使用这个值.
所以,如果我改变地球的半径,那么太阳的质量和半径变得非常大,然后再次,我无法使用它.
我不知道其他人如何解决这个问题,他们为解决这个问题做了什么,但正如我从这里看到的那样,看起来不可能对太阳系进行逼真的n体模拟.(至少统一)
所以我需要有10个代表来发布图片-_-,我会给出链接. http://berkaydursun.com/solar_system_simulator/data.PNG 另外一个目录是使用n体计算但具有UNREALISTIC值的工作实验太阳系模拟.它工作得很好,它甚至看起来有点接近真实,但不,它没有正确的比率^^你可以在这里测试它,如果你希望http://berkaydursun.com/solar_system_simulator/
编辑:WoW我几乎用"So"开始了每个段落^^
我需要提高矿井大气散射GLSL片段着色器之一的功能的精度,该着色器可计算单射线与轴对齐的椭球之间的交点。
这是矿山大气散射着色器的核心功能。旧的原始着色器已启用,floats并且可以正常渲染,但是添加缩放后,我发现距离相对较小时会失去精度。在浮子上,地球的可用距离仅为0.005 AU(天文单位)。因此,我尝试将关键功能移植到该端口上,double并且它有所帮助,因此现在可用距离约为1.0 AU(带有较小的伪像)
这是doubleFragment Shader中函数的版本(旧版本的源代码已弃用!!!)
#extension GL_ARB_gpu_shader_fp64 : enable
double abs(double x) { if (x<0.0) x=-x; return x; }
// compute length of ray(p0,dp) to intersection with ellipsoid((0,0,0),r) -> view_depth_l0,1
// where r.x is elipsoid rx^-2, r.y = ry^-2 and r.z=rz^-2
float view_depth_l0=-1.0,view_depth_l1=-1.0;
bool _view_depth(vec3 _p0,vec3 _dp,vec3 _r)
{
double a,b,c,d,l0,l1;
dvec3 p0,dp,r;
p0=dvec3(_p0);
dp=dvec3(_dp);
r =dvec3(_r );
view_depth_l0=-1.0;
view_depth_l1=-1.0;
a=(dp.x*dp.x*r.x)
+(dp.y*dp.y*r.y)
+(dp.z*dp.z*r.z); a*=2.0;
b=(p0.x*dp.x*r.x)
+(p0.y*dp.y*r.y)
+(p0.z*dp.z*r.z); b*=2.0;
c=(p0.x*p0.x*r.x) …Run Code Online (Sandbox Code Playgroud) 我想用WebGL从低轨道(这里约300公里)建立一个逼真的地球视图.也就是说,在网络上,它具有所暗示的一切,而且在移动设备上.不要在这里停止阅读:为了减少这一点,用户可以到处看,但不能平移,所以视图只涉及3000km宽的小区域.但是这个视图跟随一颗卫星几分钟后,用户回到原来的状态,地球的旋转稍微移动等等.所以云不能一直在同一个地方.
我实际上已经能够包括城市的灯光,极光,闪电......除了云.我已经看到很多实时渲染热情和研究人员的演示,但他们都没有一个漂亮,逼真的云层.但是我确信我是第100个想到这样做的人,所以请高兴我.
提出的问题很少:
以下是总结我尚未看到的一些想法,按重要性排序:
云隐藏了60%的地球.
云散射城市和闪电的灯光,晚上有瑞利散射.
在这个距离处,视差效果是可见的,甚至在最小的云层中也非常棒.
据我所见,即使是昂贵的实时气象在线资源也没用:它们在紫外线和红外线光波的帮助下瞄准下雨或暴风雨的云层,因此它们不会100%捕获它们并且不会给出正常的"我们都知道.此外,在可见光下拍摄的罕见的良好云纹理几乎不能将地面与云层区分开来:有时长达5000公里的海岸无处不在.服务器可能能够使用这些图像来创建更好的纹理.
当我看到那些图片时,我想最好的方法是从包含不同模型的数据库中合并几个漂亮的云网格,然后在用户经过时稍微转换着色器内的网格.如果他回来后90分钟仍然在这里,无论模特是否再次相同.然而,飓风不能消失.
你怎么看待这件事 ?
我正在尝试向我的应用程序添加凹凸贴图功能,但我得到了非常多面的模型:

发生这种情况的原因是因为我正在计算每个面的切线、副法线和法线,而完全忽略了我从模型文件中获得的法线。
计算目前使用三角形的两条边和纹理空间向量得到切线和副法线,然后通过叉积计算法线。模型加载后,这一切都在 CPU 上完成,然后将值存储为模型几何的一部分。
vector1 = vertex2.coords - vertex1.coords;
vector2 = vertex3.coords - vertex1.coords;
tuVector = vertex2.texcoords - vertex1.texcoords;
tvVector = vertex3.texcoords - vertex1.texcoords;
float den = 1.0f / (tuVector.x * tvVector.y - tuVector.y * tvVector.x);
tangent.x = (tvVector.y * vector1.x - tvVector.x * vector2.x) * den;
tangent.y = (tvVector.y * vector1.y - tvVector.x * vector2.y) * den;
tangent.z = (tvVector.y * vector1.z - tvVector.x * vector2.z) * den;
binormal.x = (tuVector.x * vector2.x - tuVector.y * vector1.x) * …Run Code Online (Sandbox Code Playgroud) 我目前正在开发2D等距地图编辑器.我显示包含点和纹理的实体(立方体,玩家).每个立方体由12个点组成(12个点,但由sfml(sf :: VertexArray)显示时处理为4个点的3个边).
(我知道我包含了一些'.cpp'时间,我的IDE(视觉工作室)有问题,我正试图解决它,请不要关心它.)
main.cpp中
#pragma once
#include "globalfunctions.h" //global functions + main headers + class headers
int main() {
int mapSize = 0;
int cubeSize = 0;
cout << "Map size: "; cin >> mapSize; cout << endl;
cout << "Cube size: "; cin >> cubeSize; cout << endl;
int windowWidth = (mapSize * cubeSize) - (cubeSize * 2);
int windowHeight = ((mapSize * cubeSize) - (cubeSize * 2)) / 2;
renderWindow window(windowWidth, windowHeight, mapSize, cubeSize);
int nbMaxTextures = …Run Code Online (Sandbox Code Playgroud) 例如,在"我的世界"中,您可以将火炬放置在任何地方,每个火炬都会影响世界上的光照水平,并且您可以在世界范围内放置的火炬/光源数量没有限制.我99%确定火炬的照明在CPU上处理并为每个块存储,因此当在某个块上渲染光值时,只需要将其传递到着色器,但是光源不能为此移动原因.如果你有一个游戏,你可以放置可以四处移动的光源(箭头着火,带有灯光的矿车,发光的能量球)和照明不是那么简单(包括颜色)什么是最有效的计算灯光效果的方法.
根据我的研究,我发现不同的渲染,不同的光照,动态创建具有不同光量的着色器并使用for循环(不能使用由于展开的制服)和静态光照贴图(这些可能仅用于还是灯)有没有其他方法可以进行照明计算,例如做除了允许移动灯光之外做什么类型的Minecraft,或者是否可以采用无限量的灯光并在数学上将它们组合成仅涉及几个灯光的近似值(这是一个想法我想出来但我无法弄清楚它是如何完成的?)
如果它有帮助,我是一个在OpenGL(传统和现代)方面具有良好经验的程序员,所以你可以给我代码片段,虽然我没有做太多的照明,所以简短的解释将不胜感激.如果你能指出我正确的方向,我也愿意做研究!
我是OpenGl的专家,因此,我正在尝试仅学习4.x的现代OpenGl。一旦完成了基础教程(例如旋转多维数据集),我就决定尝试创建一个仅处理多维数据集的基于体素的程序。该程序的目标是快速,使用有限的CPU能力和内存以及动态的,因此映射大小可以更改,并且只有在数组中表示已填充块时才绘制块。
我有一个VBO,它具有由三角形构成的多维数据集的顶点和索引。首先,如果我告诉renderGl着色器使用render函数,然后在完成后绑定VBO,则执行此循环
绘制立方体循环:
//The letter_max are the dimensions of the matrix created to store the voxel status in
// The method I use for getting and setting entries in the map are very efficient so I have not included it in this example
for(int z = -(z_max / 2); z < z_max - (z_max / 2); z++)
{
for(int y = -(y_max / 2); y < y_max - (y_max / 2); y++)
{
for(int x = -(x_max / 2); x …Run Code Online (Sandbox Code Playgroud) glsl ×3
opengl ×3
3d ×2
c++ ×2
javascript ×2
math ×2
shader ×2
webgl ×2
2d ×1
algorithm ×1
artifacts ×1
astronomy ×1
c ×1
colors ×1
dart ×1
directx ×1
game-physics ×1
geometry ×1
graphics ×1
hlsl ×1
isometric ×1
lighting ×1
opengl-4 ×1
optimization ×1
performance ×1
physics ×1
printf ×1
rgb ×1
sfml ×1
simulation ×1
textures ×1
three.js ×1