Threejs开发3D展馆 | 大帅老猿threejs特训

这篇具有很好参考价值的文章主要介绍了Threejs开发3D展馆 | 大帅老猿threejs特训。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文将介绍如果使用Threejs开发制作一个3D展馆,效果如图:

threejs 展厅,3d

 首先,我们需要一个展馆模型。我是通过Blender做出来的,在Blender中将模型导出为glb格式。

threejs 展厅,3d

接下来,我们通过代码将模型加载到网页中。

在3D图形开发中,最基本的概念就是场景、相机和光源。这三个是构成3D世界的基本要素。所以,我们需要先创建一个场景、设置相机和光源。

//创建场景
const scene = new THREE.Scene();

//设置相机
const camera = new THREE.PerspectiveCamera(45, container.offsetWidth / container.offsetHeight, 10, 10000);
camera.position.set(5, 10, -40);//设置相机位置
camera.lookAt(0,0,0);//让相机看相原点
//光源,平行光
var light2 = new THREE.DirectionalLight(0xffffff, 1);
scene.add(light2);

然后,我们使用Threejs提供的GLTFLoader将模型加载进来。

const loader = new GLTFLoader();
loader.load(
'../resources/models/zhanguan2.glb',
function (gltf) {
scene.add(gltf.scene);//将模型添加到场景中
})

效果如下:

threejs 展厅,3d

这时候我们会发现,整个场馆有点暗,而且只有场馆里面是亮的,围墙是黑乎乎的。因为我们用的是平行光,有些地方会照不到,所以就是黑的了。接下来,我们用环境贴图的方式,照亮整个场馆。我们使用这张图片:

threejs 展厅,3d

new RGBELoader().load('../resources/sky.hdr', function (texture) {

texture.mapping = THREE.EquirectangularReflectionMapping

scene.environment = texture

renderer.outputEncoding = THREE.sRGBEncoding

renderer.render(scene, camera)

})

效果如下:

threejs 展厅,3d

 接下来,我们来实现,2023烟花播放的效果。效果看起来很酷炫,但其实实现起来挺简单的。

gltf.scene.traverse((child) => {

if (child.name === '2023') {

let happyNewYear2023 = child

const video = document.createElement('video')

video.src = './resources/yanhua.mp4'

video.muted = true

video.autoplay = true

video.loop = true

const VideoTexture = new THREE.VideoTexture(video)

const videoMaterial = new THREE.MeshBasicMaterial({

map: VideoTexture

})
happyNewYear2023.material = videoMaterial
}
}

 上面这段代码,就是通过遍历的方式,将2023这个子模型筛选出来。然后使用视频贴图,将贴图映射到“2023”上。效果如下:

threejs 展厅,3d

接下来,我们将人物角色加载进来,同样使用的是GLTFLoader. 

new GLTFLoader().load('../resources/models/player.glb', (gltf) => {
  playerMesh = gltf.scene
  scene.add(playerMesh)
}

角色加载进来后,如何让她移动呢?使用playerMesh.translateZ()方法,让其在Z轴方向移动,对应到场景中,就是在地面上移动了。那如果碰到墙壁,是不是就不应该让角色继续前进了呢?所以要实现碰撞检测功能,这里使用Threejs中的Raycaster射线检测来实现。

window.addEventListener('keydown', (e) => {

if (e.key === 'w') {

const curPos = playerMesh.position.clone(); //获取角色当前位置

playerMesh.translateZ(1);//让角色往前走一步

const frontPos = playerMesh.position.clone();//在获取现在的位置

playerMesh.translateZ(-1 );//退回原来的位置

const frontVector3 = frontPos.sub(curPos).normalize()//让前面位置的向量减去后面位置的向量

const raycasterFront = new THREE.Raycaster(playerMesh.position.clone().add(playerHalfHeight), frontVector3);

const collisionResultsFrontObjs = raycasterFront.intersectObjects(scene.children);

if (collisionResultsFrontObjs && collisionResultsFrontObjs[0] && collisionResultsFrontObjs[0].distance > 1) { // 距离大于1才可以继续前进

playerMesh.translateZ(0.1);

}

}
if (e.key === 's') {//后退
playerMesh.translateZ(-0.1);
}
})

到这里,展馆的基本功能就实现完了。文章来源地址https://www.toymoban.com/news/detail-666010.html

到了这里,关于Threejs开发3D展馆 | 大帅老猿threejs特训的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于threejs开发的3D地球大屏可视化,支持2D地图模式,飞线,涟漪,配置简单易上手

    基于threejs 封装的3D可视化地球组件,开箱即用 主要实现功能 根据geojson格式的json文件,渲染平面2D 和3D地图,地图可配置区域色,边界色 支持以贴图的方式实现用户设计的个性化地图图片的3D地球渲染(2D的支持正在开发) 通过本组件提供的方法可实现 新增飞线动画 和 标记

    2024年02月08日
    浏览(52)
  • Threejs 3D模型居中

    项目开发中难免会遇到客户导出的3D模型中心点并不在坐标中心,这时候直接渲染这个模型会发现模型位置会有所偏移 引用:Three.js模型居中

    2024年02月13日
    浏览(41)
  • 基于ThreeJS的3D地球

    第一次接触threeJS,说实话,挺脑瓜子疼的! 功能:3D地球(纹理贴图),地球上添加标记点(经纬度),点击标记点弹出对应的信息框,地球入场动画,相机移动动画等。 先开效果图吧 一:添加必要的依赖 二:组件代码 三:父组件中的代码 四:项目gitee地址 mythree: 基于

    2024年02月12日
    浏览(27)
  • ThreeJS-3D教学七-交互

    在threejs中想要选中一个物体,点击或者鼠标悬浮,又或者移动端的touch事件,核心都是通过new THREE.Raycaster完成的。这里用到了一个概念,即我们点击时的 屏幕坐标 转换为 three中的3D坐标。 先看效果图: 代码是: 具体思路代码中都有注释,实在不懂也没关系,函数一封装先

    2024年02月08日
    浏览(27)
  • ThreeJS-3D教学五-材质

    我们在ThreeJS-3D教学二:基础形状展示中有简单介绍过一些常用的材质,这次我们举例来具体看下效果: 代码是这样的: 图片我依次放进来,方便大家本地看效果 stone.jpg stone-bump.jpg normal2.jpg normal1.jpg earth.jpg earthSpec.png 具体的注释也都放代码里了!感觉不错的点个赞,光白嫖

    2024年02月07日
    浏览(30)
  • threejs 3D标注

    css 样式内不要加 scoped 会找不到样式

    2024年02月21日
    浏览(35)
  • ThreeJS之3D柱形图

            学习threejs第二篇,3D柱形图练习,本文参考了网上的实现方式,用html方式进行了实现。先上效果图: 关键代码:  数据准备 柱形图分为上下两部分,因此使用了二维数组,表示上半部分和下半部分。 生成柱形图 通过对数据源的循环,以此生成矩形图,图表使用

    2024年02月15日
    浏览(29)
  • Threejs实现3d地球记录(4)

    Three.js基础曲线函数有三种: 样条曲线:在三维空间中设置5个顶点,输入三维样条曲线CatmullRomCurve3函数作为参数,然后返回更多个顶点,通过返回的顶点数据,构建一个几何体,然后绘制出来一条沿着5个顶点的光滑样条曲线。 三维三次贝赛尔曲线: 由起点、终点、及两个

    2024年02月02日
    浏览(35)
  • 如何使用 ThreeJs 以 glTF、FBX 和 OBJ 文件格式加载 3D 模型,使用 ThreeJS 加载和显示带有纹理的 3D 模型

    在本文中,我展示了如何使用 ThreeJS 在 Web 视图中加载 3D 模型。Three.js 是一个跨浏览器的 JavaScript 库和应用程序编程接口,用于使用 WebGL 在 Web 浏览器中创建和显示动画 3D 计算机图形。加载不完整的原因有很多,例如纹理和材质渲染不正确。 创建场景 渲染场景 动画立方体

    2023年04月08日
    浏览(38)
  • ThreeJS-3D教学六-物体位移旋转

    之前文章其实也有涉及到这方面的内容,比如在ThreeJS-3D教学三:平移缩放+物体沿轨迹运动这篇中,通过获取轨迹点物体动起来,其它几篇文章也有旋转的效果,本篇我们来详细看下,另外加了tween.js知识点,tween可以很好的协助 three 做动画,与之相似的还有 gsap.js方法类似。

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包