Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >THREE.js:在允许彩色灯光的同时模拟MeshBasicMaterial

THREE.js:在允许彩色灯光的同时模拟MeshBasicMaterial
EN

Stack Overflow用户
提问于 2017-06-10 20:56:59
回答 1查看 1.7K关注 0票数 2

我正在制作一个地牢爬虫类型的游戏使用three.js。我使用MeshBasicMaterial使所有的东西都“真光”,使地牢始终可见。然而,我想添加“额外”的灯光通过门道下或在墙上的狭缝,以营造气氛。但是BasicMaterial上没有显示光线,所以我转到Phong去测试地板上的光线。现在我的地板是黑色的!很可能是因为没有全球光。

有什么方法可以模拟MeshBasicMaterial的特性,同时允许不同颜色的灯光?地牢四面八方都是封闭的,所以我认为放一个非常大的全球光会在任何地方投下阴影,或者盖过地面上的颜色。

这不是我问题的主要焦点,但另外:我怎样才能使光线被墙壁所阻挡,而不是仅仅通过墙壁进行剪辑?墙壁仅仅是由映射系统生成的1x1x1三维网格立方体。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-14 12:49:24

一旦你切换到MeshPhongMaterial,材料就会变成阴影。你可以设置一些参数,使它更接近MeshBasicMaterial,但你仍然会得到梯度照明,这正是你在寻找你的“额外”照明。在下面的代码中,我将shininess属性设置为0,这消除了Phong阴影的硬光效应。

为了让光线不流过你的墙壁,你需要实施阴影投射。在THREE.js中,这实际上是非常简单的,而且网上有大量的文章描述如何做到这一点,所以我不会在这里重复这些内容。但是,正如您在我的简单示例中所看到的,您需要将网格设置为投射和接收阴影(分别为castShadows/receiveShadows),并将光线设置为投射它们(castShadows)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var renderer, scene, camera, controls, stats;

var WIDTH = window.innerWidth,
  HEIGHT = window.innerHeight,
  FOV = 70,
  NEAR = 1,
  FAR = 1000;

function populateScene() {
  var cfgeo = new THREE.PlaneBufferGeometry(100, 100),
    lwallgeo = new THREE.PlaneBufferGeometry(20, 20),
    rwallgeo = new THREE.PlaneBufferGeometry(50, 20),
    farwallgeo = new THREE.PlaneBufferGeometry(50, 20),
    bumpgeo = new THREE.PlaneBufferGeometry(10, 10);

  var mat = new THREE.MeshPhongMaterial({
    color: 0xcccccc,
    emissive: new THREE.Color(0x0c0c0c),
    shininess: 0,
    side: THREE.DoubleSide
  });

  var ceiling = new THREE.Mesh(cfgeo, mat),
    floor = new THREE.Mesh(cfgeo, mat),
    lwall = new THREE.Mesh(lwallgeo, mat),
    rwall = new THREE.Mesh(rwallgeo, mat),
    farwall = new THREE.Mesh(farwallgeo, mat),
    bump1 = new THREE.Mesh(bumpgeo, mat),
    bump2 = new THREE.Mesh(bumpgeo, mat);
  ceiling.castShadow = true;
  ceiling.receiveShadow = true;
  floor.castShadow = true;
  floor.receiveShadow = true;
  lwall.castShadow = true;
  lwall.receiveShadow = true;
  rwall.castShadow = true;
  rwall.receiveShadow = true;
  farwall.castShadow = true;
  farwall.receiveShadow = true;
  bump1.castShadow = true;
  bump1.receiveShadow = true;
  bump2.castShadow = true;
  bump2.receiveShadow = true;

  ceiling.position.y = 10;
  ceiling.rotation.x = Math.PI / 2;
  floor.position.y = -10;
  floor.rotation.x = Math.PI / -2;
  lwall.rotation.y = Math.PI / 2;
  lwall.position.x = -10;
  rwall.rotation.y = Math.PI / -2;
  rwall.position.x = 10;
  rwall.position.y = 2;
  farwall.position.z = -20;
  bump1.rotation.y = Math.PI / -2;
  bump2.rotation.y = Math.PI / -2;
  bump1.position.set(10, -10, -15);
  bump2.position.set(10, -10, 5);

  scene.add(ceiling);
  scene.add(floor);
  scene.add(lwall);
  scene.add(rwall);
  scene.add(farwall);
  scene.add(bump1);
  scene.add(bump2);

  var bonus = new THREE.SpotLight(0xcccc00, 0.5);
  bonus.position.set(15, -7, -5);
  bonus.castShadow = true;
  bonus.distance = 20;
  var tgt = new THREE.Object3D();
  tgt.position.set(0, -10, -10);
  bonus.target = tgt;
  scene.add(bonus);
  scene.add(tgt);
}

function init() {
  document.body.style.backgroundColor = "slateGray";

  renderer = new THREE.WebGLRenderer({
    antialias: true,
    alpha: true
  });
  renderer.shadowMap.enabled = true;
  renderer.shadowMap.type = THREE.PCFSoftShadowMap;

  document.body.appendChild(renderer.domElement);
  document.body.style.overflow = "hidden";
  document.body.style.margin = "0";
  document.body.style.padding = "0";

  scene = new THREE.Scene();

  camera = new THREE.PerspectiveCamera(FOV, WIDTH / HEIGHT, NEAR, FAR);
  camera.position.z = 15;
  scene.add(camera);

  controls = new THREE.TrackballControls(camera, renderer.domElement);
  controls.dynamicDampingFactor = 0.5;
  controls.rotateSpeed = 3;

  var light = new THREE.PointLight(0xffffff, 1, Infinity);
  camera.add(light);

  stats = new Stats();
  stats.domElement.style.position = 'absolute';
  stats.domElement.style.top = '0';
  document.body.appendChild(stats.domElement);

  resize();
  window.onresize = resize;

  populateScene();

  animate();
}

function resize() {
  WIDTH = window.innerWidth;
  HEIGHT = window.innerHeight;
  if (renderer && camera && controls) {
    renderer.setSize(WIDTH, HEIGHT);
    camera.aspect = WIDTH / HEIGHT;
    camera.updateProjectionMatrix();
    controls.handleResize();
  }
}

function render() {
  renderer.render(scene, camera);
}

function animate() {
  requestAnimationFrame(animate);
  render();
  controls.update();
  stats.update();
}

function threeReady() {
  init();
}

(function() {
  function addScript(url, callback) {
    callback = callback || function() {};
    var script = document.createElement("script");
    script.addEventListener("load", callback);
    script.setAttribute("src", url);
    document.head.appendChild(script);
  }

  addScript("https://threejs.org/build/three.js", function() {
    addScript("https://threejs.org/examples/js/controls/TrackballControls.js", function() {
      addScript("https://threejs.org/examples/js/libs/stats.min.js", function() {
        threeReady();
      })
    })
  })
})();

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44480512

复制
相关文章
如何使用AndroidStudio将开源项目library发布到jcenter
我相信技术爱好者都喜欢开源,也都喜欢分享,随着技术的慢慢提高,很多开发者想将自己的开源类库分享出来,对于Android开发者来说,以前使用Eclipse开发时,直接引用类库或者打成jar包分享出来就行,现在使用AndroidStudio开发,引用类库直接在build.gradle文件里面添加一行引用代码即可。我们带着问题进入分析。 为什么只需要添加一行引用代码即可 AndroidStudio是从Maven Repository服务器下载类库的。基本上有jcenter和Maven Central这两个服务器用
非著名程序员
2018/02/02
1.1K0
如何使用AndroidStudio将开源项目library发布到jcenter
将XML导入到对象中
注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码, IRIS将使用前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。
用户7741497
2022/07/04
1.6K0
如何将App程序发布到苹果App Store
将App程序发布到苹果App Store的具体步骤如下: 1、首先登录开发者中心进入证书页面。点击证书、ID及配件文件,进入设置。
iOS程序应用
2023/04/13
4410
如何将App程序发布到苹果App Store
数据传输 | 如何使用 DTLE 将 Oracle 数据同步到 MySQL
爱可生测试团队成员,主要负责 DTLE 开源项目相关测试任务,擅长 Python 自动化测试开发。
爱可生开源社区
2022/04/06
1.2K0
如何将App程序发布到苹果App Store
5、点击右下角+ADD选择,下拉选择发布证书,输入证书名称、邮箱、密码,点击ok创建。
iOS Magician
2023/03/22
7090
如何将App程序发布到苹果App Store
将项目发布到jcenter仓库
将项目发布到jcenter仓库可以方便他人直接使用,下面总结一下流程和可能遇到的问题
杜金房
2020/12/21
1.2K0
将项目发布到jcenter仓库
如何使用Restic Backup Client将数据备份到对象存储服务
Restic是一个用Go语言编写,安全且高效的备份客户端。它可以将本地文件备份到许多不同的后端存储库,例如本地目录,SFTP服务器或对象存储服务。
乌鸦
2018/07/20
3.9K1
如何将gradle插件发布到插件门户网站
注册地址:https://plugins.gradle.org/user/register
乱码三千
2021/07/29
1.4K0
如何将gradle插件发布到插件门户网站
Gradle 如何配置将编译的 JAR 发布到 Archiva 中
在这里,你需要指定 archiva 的用户名和密码,这个用户能够具有 archiva 的相关权限。
HoneyMoose
2019/10/18
1K0
如何将 Text, XML, CSV 数据文件导入 MySQL
原文出处: freenik@Jianshu 将 外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和操作中的ETL (Extract, transform,
wangxl
2018/03/08
5.9K0
如何将 Text, XML, CSV 数据文件导入 MySQL
Maven 如何将本地的项目发布到 Archiva 中
为了一些私有的项目发布到公司内部的 Archiva 中,如何使用 Maven 进行发布。
HoneyMoose
2020/04/11
2.1K0
Maven 如何将本地的项目发布到 Archiva 中
Gradle 如何配置将编译的 JAR 发布到 Archiva 中
在这里,你需要指定 archiva 的用户名和密码,这个用户能够具有 archiva 的相关权限。
HoneyMoose
2019/10/17
1.2K0
如何使用Hexo发布博客到GitHub Pages
你应该会在GitHub Pages看到你的博客了,地址为http://****.github.io。
fanzhh
2019/08/20
6540
ajax ---- json 和 xml 区别
(1).XML的优缺点 <1>.XML的优点   A.格式统一,符合标准;   B.容易与其他系统进行远程交互,数据共享比较方便。 <2>.XML的缺点   A.XML文件庞大,文件格式复杂,传输占带宽;   B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;   C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;   D.服务器端和客户端解析XML花费较多的资源和时间。
小蔚
2019/09/11
1.3K0
如何将workerman部署到windows服务器上面
一直以来对php的即时通讯都很好奇,其实是不知道应该怎么来实现,后来了解到了swoole和workerman这两个神器,他们都可以实现即时通信的功能,其中swoole是C语言编写的php扩展,其配置起来比较麻烦,但是性能还是很强悍的这些可以自己去官网上面搜,还有一个就是workerman框架啦!它确实是使用php写出来的框架而且使用的就是php socket中的东西。如果是将项目项目布置到linux服务器的话我觉的两者都可以,但是如果你是使用的windows服务器的话那就面临着一个困难———swoole不支持windows环境,当然如果非要布置的话使用docker应该也可以,但是总觉的有些不伦不类的感觉(不是说docker不伦不类,docker确实强悍),那么我们怎么办呢??这个时候就凸显出workerman的优势啦!它可以在windows系统运行下载这个聊天室项目
码缘
2019/09/11
3.8K0
如何将workerman部署到windows服务器上面
dataTables 使用ajax 和服务器处理 获取数据
Datatables是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。 官网:https://datatables.net/ 中文网:https://datatables.club/
Alone88
2019/10/22
5.2K0
将Hexo部署到云服务器(使用宝塔面板)
本来Hexo是部署在GitHub上的(可以看我之前文章Hexo搭建静态博客 - Taitres' Blog包括了Hexo的基本使用),但是访问太慢了,并且想折腾一下,还想整个个人云盘,就买了个腾讯云的轻量应用服务器,把Hexo搬过来了,看了很多文章,记录下最终的解决方案。
Taitres
2021/05/13
14.1K4
将项目发布到 Homebrew 官方仓库
Homebrew 标榜自己是 “macOS(或 Linux)缺失的软件包的管理器”,使用 macOS 作为开发终端的用户,往往绕不过 brew 这个软件包管理工具。确实在 macOS 上没有比 brew 更好用的软件包管理工具了,基本上想用的 CLI 工具,只需一行命令就可一键安装,非常的方便。记得去年博主还写过一篇 《Golang 装逼指南 Ⅱ:在 Homwebrew 上发布 Golang 项目》,当时只是介绍了如何将 Golang 开发的 CLI 工具发布到自建的 homebrew-tap 上。本文则是讲解如何将自己开发的软件,推送到官方的 homebrew-core[1] 仓库中,使用像 brew install kubecm 这样的命令即可完成安装。
郭旭东
2020/12/30
1.7K0
将项目发布到 Homebrew 官方仓库
【前端系列-1】ajax与Springboot通信将数据库数据渲染到前端表格
jQuery对原生js进行了大量封装,让我们使用起来更加方便,尤其ajax。这里就对jQuery的ajax做一个总结。
云深i不知处
2020/09/16
2.5K0
php与Ajax(四)—xml与json数据格式
因为json数据是原生态数据,因此这种数据格式很稳定,而且描述能力强,我们建议大家使用json格式
致Great
2023/08/26
1920

相似问题

无法在wxPython虚拟网格中添加列

14

无法使用wxpython

10

无法退出wxpython

25

wxPython持续更新面板

11

WxPython StaticText动态更新

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文