一般而言,须要实现3D物体的渐变,通常的思路就是通过2D绘制一张渐变canvas图片作为3D对象的贴图。这样的方式是能够解决这类问题的。只是对于一般用户而言,通过2D生成一张渐变的图片。有一定的难度,另外假设要生成的图片比較多。性能效率上会成为一个瓶颈,特别是渐变随着条件在不断变化的情况下。就须要每次绘制的时候都去生成一张渐变的canvas图,效率极其低。

在3D中,第二种通常的方式就是通过顶点色来实现渐变。然而这样的方式对于用户的难度更大,由于须要用户了解3D底层的一些原理,同一时候须要对于每一个物体的顶点结构有深入了解。虽然如此难。这样的方式由于受到了顶点数量的限制。其渐变的颜色数量也受到了限制,这是不能接受的一个问题。

由此看来,3D对象实现随意渐变有一定难度。只是。有一个好消息是,对于使用TWaver 3D的用户而言。TWaver 3D从底层封装了一些经常使用的渐变,用户仅仅须要调用简单的接口,就能够实现3D物体的色彩缤纷。

假设通过TWaver 3D实现渐变,通过一个简单的样例,就能够看出来效果:

1 var box,
node;
2          function load()
{
3  
4              box
new mono.DataBox();
5              var camera
new mono.PerspectiveCamera(30,
1.5, 0.1, 10000);
6              camera.setPosition(0,
200, 500);
7  
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);
13  
14              var pointLight
new mono.PointLight(0xFFFFFF,
1);
15              pointLight.setPosition(10000,
10000, 10000);
16              box.add(pointLight);
17              box.add(new mono.AmbientLight(0x888888));
18              createGradientNode();
19          }
20  
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',
{
25                  0
'red',
26                  1
'orange'
27              });
28              node.setStyle('top.m.gradient',
{
29                  0
'yellow',
30                  1
'orange'
31              });
32              node.setStyle('bottom.m.gradient',
{
33                  0
'yellow',
34                  1
'red'
35              });
36              node.setStyle('side.m.gradientType',
2);
37              node.setStyle('top.m.gradientType',
5);
38              node.setStyle('bottom.m.gradientType',
5);
39              box.add(node);
40          }
41  
42          function randomSeverity()
{
43              var severities
= mono.AlarmSeverity.severities;
44              return severities.get(randomInt(severities.size()));
45          };
46  
47          function randomInt(n)
{
48              return Math.floor(Math.random()
* n);
49          };

当中设置节点渐变的代码例如以下,当中对圆柱体的top,side。bottom 3个面都设置了渐变,top。bottom设置了radial 渐变,side设置了linear渐变:

1 node.setStyle('side.m.gradient',
{
2                     0
'red',
3                     1
'orange'
4                 });
5                 node.setStyle('top.m.gradient',
{
6                     0
'yellow',
7                     1
'orange'
8                 });
9                 node.setStyle('bottom.m.gradient',
{
10                     0
'yellow',
11                     1
'red'
12                 });
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;

版权声明:本文博客原创文章。博客,未经同意,不得转载。

如何实现TWaver 3D颜色渐变的更多相关文章

  1. WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化

    原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化 注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及 ...

  2. iOS 动画绘制线条颜色渐变的折线图

    效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有 ...

  3. CSS3颜色渐变模式

       1.线性渐变:linear-gradient 语法:<linear-gradient> = linear-gradient([ [ <angle> | to <si ...

  4. 【iOS实现一个颜色渐变的弧形进度条】

    在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...

  5. IOS导航栏颜色渐变与常用属性

    (转:http://www.cnblogs.com/Lingchen-start/archive/2015/10/23/4904361.html) 今年很忙,忙的写日志的时间都很少.  少的可怜. 自 ...

  6. css3的背景颜色渐变@线性渐变

    背景颜色渐变之线性渐变 语法形式: firefox浏览器 background:-moz-linear-gradient(position/deg,startColor,endColor); oper ...

  7. 颜色渐变的JS代码

    今天做组织机构,要分级别显示颜色,自己计算半天也没算出颜色渐变的方法,出来总是花里胡哨的难看的不要不要的,所以查了一下,找到一个js代码,试了试,很完美哦! <!DOCTYPE html> ...

  8. android Button 切换背景,实现动态按钮和按钮颜色渐变

        android Button 切换背景,实现动态按钮和按钮颜色渐变 一.添加android 背景筛选器selector实现按钮背景改变     1.右键单击项目->new->Oth ...

  9. 怎样创建TWaver 3D的轮廓选中效果

    在一般的游戏中.物体的选中效果会是这样: TWaver 3D中,物体的默认的选中效果一般都是一个方方正正的外框.在HTML5的Mono版本号中,TWaver提供了轮廓线样式的选中效果. 通过例如以下代 ...

随机推荐

  1. 基于Qt有限状态机的一种实现方式和完善的人工智能方法

    基于Qt有限状态机的一种实现方式和完善的人工智能方法 人工智能在今年是一个非常火的方向,当然了.不不过今年,它一直火了非常多年,有关人工智能的一些算法层出不穷.人工智能在非常多领域都有应用,就拿我熟悉 ...

  2. 备注ocp_ORACLE专题网络

    声明:原创作品,出自 "深蓝的blog" 博客.欢迎转载.转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanl ...

  3. hdu4770:Lights Against Dudely(回溯 + 修剪)

    称号:hdu4770:Lights Against Dudely 题目大意:相同是n*m的矩阵代表room,房间相同也有脆弱和牢固之分,如今要求要保护脆弱的房间.须要将每一个脆弱的房间都照亮,可是牢固 ...

  4. 十依据一个有用的算法来找到最小(最大)的k的数量-线性搜索算法

    例如:进入1.2.3,4,5,6.7.8此8数字,最小的4图的1,2,3,4. 思路1:最easy想到的方法:先对这个序列从小到大排序.然后输出前面的最小的k个数就可以.假设选择高速排序法来进行排序, ...

  5. POJ 3979 分数减法【数学问题的探讨】

    将a/b和c/d简化一下就可以了 分数加减法 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12588   Accepted ...

  6. UVa 10285 - Longest Run on a Snowboard

    称号:给你一个二维矩阵,找到一个点.每一个可以移动到的位置相邻的上下,求最长单调路径. 分析:贪婪,dp.搜索. 这个问题是一个小样本,我们该怎么办. 这里使用贪心算法: 首先.将全部点依照权值排序( ...

  7. 记2014“蓝桥杯全国软件大赛&quot;决赛北京之行

    5月29,30日 最终到了这一天.晚上有数据结构课,10点多的火车,我们就没有去上课,下午在宿舍里收拾东西,晚上8点左右从南校出发,9点半多到达火车站和老师学长学姐们会和. 第一次去北京,第一次买的卧 ...

  8. jQuery性能优化篇

    jQuery高级技巧——性能优化篇 阅读目录 通过CDN(Content Delivery Network)引入jQuery库 减少DOM操作 适当使用原生JS 选择器优化 缓存jQuery对象 定义 ...

  9. java缓存技术(转)

    最近在做java缓存,了解了一下.以下仅是对map对方式讨论.没有对点阵图阵讨论.作缓存要做以下2点: 1:清理及更新缓存时机的处理:   . 虚拟机内存不足,清理缓存   .. 缓存时间超时,或访问 ...

  10. 背包问题 (DP)

    利用记忆化数组.记dp[i][j]为根据rec的定义,从第i个物品开始挑选总重小于j时,总价值的最大值. 递推式: dp[i][j]=0     (j<w[i]) dp[i][j] dp[i][ ...