一般而言,须要实现3D物体的渐变,通常的思路就是通过2D绘制一张渐变canvas图片作为3D对象的贴图。这样的方式是能够解决这类问题的。只是对于一般用户而言,通过2D生成一张渐变的图片。有一定的难度,另外假设要生成的图片比較多。性能效率上会成为一个瓶颈,特别是渐变随着条件在不断变化的情况下。就须要每次绘制的时候都去生成一张渐变的canvas图,效率极其低。
在3D中,第二种通常的方式就是通过顶点色来实现渐变。然而这样的方式对于用户的难度更大,由于须要用户了解3D底层的一些原理,同一时候须要对于每一个物体的顶点结构有深入了解。虽然如此难。这样的方式由于受到了顶点数量的限制。其渐变的颜色数量也受到了限制,这是不能接受的一个问题。
由此看来,3D对象实现随意渐变有一定难度。只是。有一个好消息是,对于使用TWaver 3D的用户而言。TWaver 3D从底层封装了一些经常使用的渐变,用户仅仅须要调用简单的接口,就能够实现3D物体的色彩缤纷。
假设通过TWaver 3D实现渐变,通过一个简单的样例,就能够看出来效果:
4 |
box
= new mono.DataBox(); |
5 |
var camera
= new mono.PerspectiveCamera(30,
1.5, 0.1, 10000); |
6 |
camera.setPosition(0,
200, 500); |
8 |
var network
= new mono.Network3D(box,
camera, myCanvas); |
9 |
var interaction
= new mono.DefaultInteraction(network); |
10 |
interaction.zoomSpeed
= 10; |
11 |
network.setInteractions([ new mono.SelectionInteraction(network),
interaction]); |
12 |
mono.Utils.autoAdjustNetworkBounds(network,
document.documentElement, 'clientWidth' , 'clientHeight' ,
0, 30); |
14 |
var pointLight
= new mono.PointLight(0xFFFFFF,
1); |
15 |
pointLight.setPosition(10000,
10000, 10000); |
17 |
box.add( new mono.AmbientLight(0x888888)); |
21 |
function createGradientNode(i)
{ |
22 |
var node
= new mono.Cylinder(30,
30, 60,100); |
23 |
node.setStyle( 'm.color' , 'orange' ); |
24 |
node.setStyle( 'side.m.gradient' ,
{ |
28 |
node.setStyle( 'top.m.gradient' ,
{ |
32 |
node.setStyle( 'bottom.m.gradient' ,
{ |
36 |
node.setStyle( 'side.m.gradientType' ,
2); |
37 |
node.setStyle( 'top.m.gradientType' ,
5); |
38 |
node.setStyle( 'bottom.m.gradientType' ,
5); |
42 |
function randomSeverity()
{ |
43 |
var severities
= mono.AlarmSeverity.severities; |
44 |
return severities.get(randomInt(severities.size())); |
47 |
function randomInt(n)
{ |
48 |
return Math.floor(Math.random()
* n); |
当中设置节点渐变的代码例如以下,当中对圆柱体的top,side。bottom 3个面都设置了渐变,top。bottom设置了radial 渐变,side设置了linear渐变:
1 |
node.setStyle( 'side.m.gradient' ,
{ |
5 |
node.setStyle( 'top.m.gradient' ,
{ |
9 |
node.setStyle( 'bottom.m.gradient' ,
{ |
13 |
node.setStyle( 'side.m.gradientType' ,
2); |
14 |
node.setStyle( 'top.m.gradientType' ,
5); |
15 |
node.setStyle( 'bottom.m.gradientType' ,
5); |
终于的效果例如以下:
能够看出。使用TWaver 3D。仅仅须要非常少的代码。就能实现效果比較炫的渐变效果。
假设你对于底层的实现比較感兴趣,在此也能够顺便提一下,事实上底层的实现是GPU通过物体的UV坐标来实现的渐变。以linear-v渐变方式为例,假设你设置了0的位置是color1 ‘red’,1 的位置是 color2 ‘orange’,那么在不论什么一个点A上。假定其UV坐标为u,v,其颜色就能够在GPU里面计算得到:
1 |
finalColor
= (v - 0) * color2 + (1 - v) * color1; |
版权声明:本文博客原创文章。博客,未经同意,不得转载。
- WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化 注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及 ...
- iOS 动画绘制线条颜色渐变的折线图
效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有 ...
- CSS3颜色渐变模式
1.线性渐变:linear-gradient 语法:<linear-gradient> = linear-gradient([ [ <angle> | to <si ...
- 【iOS实现一个颜色渐变的弧形进度条】
在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...
- IOS导航栏颜色渐变与常用属性
(转:http://www.cnblogs.com/Lingchen-start/archive/2015/10/23/4904361.html) 今年很忙,忙的写日志的时间都很少. 少的可怜. 自 ...
- css3的背景颜色渐变@线性渐变
背景颜色渐变之线性渐变 语法形式: firefox浏览器 background:-moz-linear-gradient(position/deg,startColor,endColor); oper ...
- 颜色渐变的JS代码
今天做组织机构,要分级别显示颜色,自己计算半天也没算出颜色渐变的方法,出来总是花里胡哨的难看的不要不要的,所以查了一下,找到一个js代码,试了试,很完美哦! <!DOCTYPE html> ...
- android Button 切换背景,实现动态按钮和按钮颜色渐变
android Button 切换背景,实现动态按钮和按钮颜色渐变 一.添加android 背景筛选器selector实现按钮背景改变 1.右键单击项目->new->Oth ...
- 怎样创建TWaver 3D的轮廓选中效果
在一般的游戏中.物体的选中效果会是这样: TWaver 3D中,物体的默认的选中效果一般都是一个方方正正的外框.在HTML5的Mono版本号中,TWaver提供了轮廓线样式的选中效果. 通过例如以下代 ...
随机推荐
- System.ComponentModel.BackgroundWorker在WinForm中的异步使用
为了防止操作过程中界面卡死,和WinForm搭配最适合的就是BackgroundWorker了.BackgroundWorker 类 using System; using System.Compon ...
- 【转】Android HTTP协议
前言 说到HTTP协议,那必须要说说WWW了,WWW是环球信息网(World Wide Web )的缩写,也可以简称为Web,中文名字为“万维网”.简单来说,WWW是以Internet作为传输媒介的一 ...
- linux下串口调试工具/串口终端推荐: picocom
对于picocom, kermit, minicom, picocom 最简单易用,也全然符合我的使用需求. 安装(mint / ubuntu): $ sudo apt-get install pic ...
- 终结者:具体解释Nginx(一)
相信非常多人都听过Nginx.这个小巧的东西能够和Apache及IIS相媲美. 那么它有什么作用呢?一句话.它是一个减轻Web应用server(如Tomcat)压力和实现Web应用se ...
- .NET反编译之Reflector基础示例
这几日由于公司需要, 看了些.NET反编译技巧,特地和大家分享下 .NET反编译工具很多,Reflector是其中一个很优秀的工具,所以就用它来进行反编译工作了.今天我们就用"繁星代码生成器 ...
- JDK的dt.jar和Java BeanInfo接口
在JAVA_HOME/lib以下有两个比較重要的jar文件.tools.jar和dt.jar. tools.jar在上篇文章中做了简单的介绍.这里来介绍下dt.jar. 在Oracle官方站点搜dt. ...
- Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with
Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with 摘要 Li ...
- SPOJ 375 树链剖分
SPOJ太慢了,SPOJ太慢了, 题意:给定n(n<=10000)个节点的树,每条边有边权,有两种操作:1.修改某条变的边权:2.查询u,v之间路径上的最大边权. 分析:树链剖分入门题,看这里: ...
- Eclipse扩展安装插件方式
Eclipse安装插件经常使用的是直接安装的方式,就是将插件中包含的plugins和features文件夹中的内容直接复制到了Eclipse的plugins和features文件夹内,这样很容易导致插 ...
- hdu5044 Tree 树链拆分,点细分,刚,非递归版本
hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...