如何在 Three.js 中渲染地球上的“大气层”?
问题
我正在尝试引入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); }
解决方案
[编辑3]
这是一个紧凑的 CPU 侧代码示例,我在引擎中使用它来使用上面提供的着色器渲染大气:
if (sys->_enable_bodya) // has planet atmosphere? if (view_depth>=0.0) { glColor4f(1.0,1.0,1.0,1.0); double a,b,p[3],d[3]; sys->shd_engine.unbind(); sys->shd_scatter.bind(); // this is the atmospheric shader if (1) //*** GLSL_uniform_supported (leftover from old GL engine version) { int j; double *w; AnsiString s; a=re; b=rp; a=divide(1.0,a*a); b=divide(1.0,b*b); // radius of planet re equatoral and rp polar and ha is atmosphere thickness sys->shd_scatter.set3f("planet_r",a,a,b); a=re+ha; b=rp+ha; a=divide(1.0,a*a); b=divide(1.0,b*b); sys->shd_scatter.set3f("planet_R" ,a,a,b); sys->shd_scatter.set1f("planet_h" ,ha); sys->shd_scatter.set1f("view_depth",view_depth); // visibility distance sys->shd_scatter.set4f("B0",B0[0],B0[1],B0[2],B0[3]); // saturated atmosphere color and overglow sys->shd_scatter.set1i("lights",sys->local_star.num); // local stars for (j=0;j<sys->local_star.num;j++) { a=sys->local_star[j].r; w=sys->local_star[j].p; s=AnsiString().sprintf("light_posr[%i]",j); sys->shd_scatter.set4f(s,w[0],w[1],w[2],divide(1.0,a*a)); w=sys->local_star[j].d; s=AnsiString().sprintf("light_dir[%i]",j); sys->shd_scatter.set3f(s,w[0],w[1],w[2]); vector_mul(p,sys->local_star[j].col,10.0); s=AnsiString().sprintf("light_col[%i]",j); sys->shd_scatter.set3f(s,p[0],p[1],p[2]); } } glEnable(GL_BLEND); glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA); a=1.0; b=-2.0*view.scr->views[view.scr->view].znear; // color = pixel pos in screen space ... no Projection/ModelView is used :) // vertex = pixel pos in elypsoid space // normal = eye-pixel direction in elypsoid space zsort.rep0.g2l_dir(d,zsort.obj_pos0); glDepthMask(0); glBegin(GL_QUADS); a=divide(1.0,view.zoom); glColor4d(-1.0,-1.0,0.0,1.0); vector_ld(p,-a,-a,b); view.scr->fromscr(p,p); view.eye0.l2g(q,p); zsort.rep0.g2l_dir(q,q); vector_sub(p,q,d); vector_one(q,q); glNormal3dv(q); glVertex3dv(p); glColor4d(+1.0,-1.0,0.0,1.0); vector_ld(p,+a,-a,b); view.scr->fromscr(p,p); view.eye0.l2g(q,p); zsort.rep0.g2l_dir(q,q); vector_sub(p,q,d); vector_one(q,q); glNormal3dv(q); glVertex3dv(p); glColor4d(+1.0,+1.0,0.0,1.0); vector_ld(p,+a,+a,b); view.scr->fromscr(p,p); view.eye0.l2g(q,p); zsort.rep0.g2l_dir(q,q); vector_sub(p,q,d); vector_one(q,q); glNormal3dv(q); glVertex3dv(p); glColor4d(-1.0,+1.0,0.0,1.0); vector_ld(p,-a,+a,b); view.scr->fromscr(p,p); view.eye0.l2g(q,p); zsort.rep0.g2l_dir(q,q); vector_sub(p,q,d); vector_one(q,q); glNormal3dv(q); glVertex3dv(p); glEnd(); glDepthMask(1); glDisable(GL_BLEND); sys->shd_scatter.unbind(); sys->shd_engine.bind(); }</sys->
它取自我的引擎,因此它使用了各种您没有的东西,但它应该让您了解如何使用这些东西。例如,g2l_dir 转换向量而不是位置,l2g 转换位置而不是向量。 fromscr 将屏幕坐标转换为 3D 坐标(相机本地坐标),而 vector_one 将向量标准化为单位向量。我希望我没有忘记解释任何事情。
附加信息
- [是否有可能在尺寸和质量方面进行现实的n体太阳系模拟? ](https://forum.thirdjs.org/viewtopic.php?t=14122)
示例大气渲染
以下是大气散射和 GLSL 的一些令人印象深刻的示例:
- [揭秘实时 3D 大气散射图形](https://marcinignac.com/2014/04/03/demystifying-atmospheric-scattering/)
- [大气光散射(部分) 1)](https://www.clicktorelease.com/blog/atmospheric-light-scattering-part-1)
- [Javidx9/raymarching_
以上是如何在 Three.js 中渲染行星周围的大气层?的详细内容。更多信息请关注PHP中文网其他相关文章!

是的,JavaScript的引擎核心是用C语言编写的。1)C语言提供了高效性能和底层控制,适合JavaScript引擎的开发。2)以V8引擎为例,其核心用C 编写,结合了C的效率和面向对象特性。3)JavaScript引擎的工作原理包括解析、编译和执行,C语言在这些过程中发挥关键作用。

JavaScript是现代网站的核心,因为它增强了网页的交互性和动态性。1)它允许在不刷新页面的情况下改变内容,2)通过DOMAPI操作网页,3)支持复杂的交互效果如动画和拖放,4)优化性能和最佳实践提高用户体验。

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。