原文地址:WebGL展示3D房屋内景

由于生活和工作上的原因,从年前开始一直到处奔波,没有太多的时间去关注和学习WebGL图形学相关的技术, 不过陆陆续续都有学习使用blender进行3D建模, 而这篇文章涉及到的房屋内景3D建模就是我这段时间以来的学习成果,现在展示出来.

文件模型比较大,页面加载比较慢,请耐心等候, 实例:


Blender

Blender是开源的建模和动画制作软件,功能虽然没有3dmax和maya强大,但它精简,易学易用,而且还是开源的, 非常适合像我这样的入门级新手.如果你也想做模型和特效,创建自己心目中的3D世界,Blender值得你去尝试.

入门教程推荐台湾大神的blender教程全集

模型文件

在blender制作好模型之后,接着就是导出obj文件,接着就是使用js读取obj文件,之后就开始涉及到WebGL,具体的步骤可以参考我之前的文章 WebGL学习(3) - 3D模型

着色器

着色器代码实现的是WebGL最基本的功能,使用了一个平行光源,光照部分有环境光,漫反射,冯氏高光镜面反射.代码详情如下:

顶点着色器

attribute vec4 a_position;//顶点位置
attribute vec4 a_color;//顶点颜色
attribute vec4 a_scolor;//顶点高光颜色
attribute vec4 a_normal;//法向量
uniform mat4 u_MvpMatrix;//mvp矩阵
uniform mat4 u_ModelMatrix;//模型矩阵
uniform mat4 u_NormalMatrix;
varying vec4 v_Color;
varying vec4 v_Scolor;
varying vec3 v_Normal;
varying vec3 v_Position; void main() {
gl_Position = u_MvpMatrix * a_position;
// 计算顶点在世界坐标系的位置,以便计算点光源在顶点处点位置
v_Position = vec3(u_ModelMatrix * a_position);
// 计算变换后的法向量
v_Normal = vec3(u_NormalMatrix * a_normal);
v_Color = a_color;
v_Scolor = a_scolor;
}

片段着色器

#ifdef GL_ES
precision mediump float;
#endif
uniform vec3 u_LightPosition;//光源位置
uniform vec3 u_diffuseColor;//漫反射光颜色
uniform vec3 u_AmbientColor;//环境光颜色
uniform vec3 u_specularColor;//镜面反射光颜色
uniform float u_Shininess;// 镜面反射光泽度
uniform vec3 u_viewPosition;// 视点位置
varying vec3 v_Normal;//法向量
varying vec3 v_Position;//顶点位置
varying vec4 v_Color;//顶点颜色
varying vec4 v_Scolor;//顶点高光颜色 void main() {
vec3 normal = normalize(v_Normal);
// 平行光
vec3 lightDirection = normalize(u_LightPosition);
// 计算光线方向和法向量点积
float nDotL = max(dot(lightDirection, normal), 0.0);
// 漫反射光亮度
vec3 diffuse = u_diffuseColor * nDotL * v_Color.rgb;
// 环境光亮度
vec3 ambient = u_AmbientColor * v_Color.rgb;
// gl_FragColor = vec4(diffuse + ambient, v_Color.a); // 观察方向的单位向量V
vec3 eyeDirection = normalize(u_viewPosition - v_Position.xyz);// 反射方向
// 反射方向
vec3 reflectionDirection = reflect(-lightDirection, normal);
// 镜面反射亮度权重
float specularWeighting = pow(max(dot(reflectionDirection, eyeDirection), 0.0), u_Shininess);
vec3 specular = u_specularColor.rgb * specularWeighting;
gl_FragColor = vec4(ambient + diffuse + specular, v_Color.a);
}

模型变换

模型变换同样可参考我之前的文章WebGL多模型光照综合实例

总结

这个实例最困难和花费时间最多的其实是3D建模部分,而开发所使用到的WebGL知识点由于比较基础,反而没多大难度.总之要做出酷炫逼真的特效和模型,还得继续深入学习3D建模.

WebGL展示3D房屋内景的更多相关文章

  1. 基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用

    基于 HTML5 WebGL 的 3D 风机 Web 组态工业互联网应用 前言 在目前大数据时代背景之下,数据可视化的需求也变得越来越庞大,在数据可视化的背景之下,通过智能机器间的链接并最终将人机链接 ...

  2. 分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型

    这张图每位程序员应该都深有感触. 人民心目中的程序员是这样的:坐在电脑面前噼里啪啦敲着键盘,运键如飞. 现实中程序员是这样的:编码5分钟,调试两小时. 今天我要给大家分享一个用WebGL开发的网站,感 ...

  3. 基于 HTML5 WebGL 的 3D 网络拓扑图

    在数据量很大的2D 场景下,要找到具体的模型比较困难,并且只能显示出模型的的某一部分,显示也不够直观,这种时候能快速搭建出 3D 场景就有很大需求了.但是搭建 3D 应用场景又依赖于通过 3ds Ma ...

  4. 使用WebGL 自定义 3D 摄像头监控模型

    前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...

  5. 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型

    前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...

  6. 使用H5与webGL的3D 可视化地铁展示

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...

  7. 基于H5与webGL的 3d 电子围栏展示

    前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...

  8. 基于 HTML5 + WebGL 的3D无人机 展示

    前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,也被称为“会飞的照相机”.但作为军事使用,无人机的各项性能要求更加严格.重要.本系统则是通过 Hightopo 的   ...

  9. H5 + WebGL 展示的3D无人机

    前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,也被称为“会飞的照相机”.但作为军事使用,无人机的各项性能要求更加严格.重要.本系统则是通过 Hightopo 的   ...

随机推荐

  1. C++笔记019:C++中的const修饰的是一个真正的常量

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...

  2. day11_jsp/EL/JSTL学习笔记

    一.jsp概述 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP实际上就是Servlet. JSP这门技术的最大 ...

  3. Java虚拟机-类加载

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行检验.转换解析和初始化,最终形成了可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.在Java语言里,类型的加载.连接和初始化过 ...

  4. Robot framework(RF) Builti,Screenshot和Collections标准库介绍

    1.1  Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一 ...

  5. 闲聊 “今日头条Go建千亿级微服务的实践”

      背景    今天跟同事偶然看到<今日头条Go建千亿级微服务的实践>文章,故做了一些探讨,与大家分享下,也欢迎大家多多共同探讨!.     其他资料:   如何理解 Golang 中“不 ...

  6. 如何高效的编写与同步博客 (.NET Core 小工具实现)

    一.前言 写博客,可以带给我们很多好处,比如可以让我们结识更多志同道合的人:在写博客过程中去查技术资料或者实践可以让我们对知识的掌握和理解更加深刻:通过博客分享能帮助他人收获分享的快乐等等.写博客真的 ...

  7. js基础进阶--编码实用技巧(二)

    我的个人博客:http://www.xiaolongwu.cn 接上篇文章 js编码的实用技巧(一) 5.合理利用||运算符 使用||可以作为参数之外的默认值,当第一个参数返回值为false时,那么第 ...

  8. 主成分分析PCA详解

    转载请声明出处:http://blog.csdn.net/zhongkelee/article/details/44064401 一.PCA简介 1. 相关背景 上完陈恩红老师的<机器学习与知识 ...

  9. FLASK 使用方法

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档,大部分代码引用自官方文档. 安装Flask 首先我们来安装F ...

  10. Python之深浅拷贝

    拷贝就是拷贝,何来深浅之说? Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 浅拷贝 l1 = [1,2,3 ...