HT FOR WEB学习笔记(9)风车案例

(1)首先来看一下demo的实际效果:

Paste_Image.png
Paste_Image.png

通过观察上下两张图,我们发现风车的黄色扇叶发生了变化,对,没错,今天的案例就是做一个不断旋转的风车。

(2)接下来,我们来介绍实现该demo涉及到的知识点:
a.风车的组成部分是:黄色扇叶、红色柱子,这两个部分是采用obj建模的方式构建出来(建模知识稍等在介绍),建模的部分由美工完成,我们只需要把建模的文件加载进来尽可以了;
b.由于风车是有独立的两个部分构建的,所以我们还要把这两部分组合在一起,组成一个整体的风车模型。当然有人会说,可以使用sethost()互相绑定就可以,是的,这样做也可以的,但是这样做会产生一个问题:当我想要让扇叶转动时,柱子也会跟着旋转。那么问题来了,我们采用什么方法呢,是的,我们采用:模型组合。
c.最后:采用interval定时器,定时改变扇叶的rotation的属性,这样,扇叶就会出现上述的动画效果了。(当然我们也可以用调度的方式实现。以后会说)

(3)HT知识点拓展:
a.首先,我们来介绍下obj部分的知识内容:
(也可查阅官网obj手册:http://www.hightopo.com/guide/guide/plugin/obj/ht-obj-guide.html
(3.1)什么是obj格式?
简单说:就是后缀名分别:.obj 和.mtl 资源文件。在新建项目上引入就好了。如图:(该图非本demo的资源图。)

Paste_Image.png

我们更多打交道的是.mtl资源文件(PS:截止到本小白接触学习的时间点为止,所碰到的几个demo里,都有对mtl文件的深入了解。),所以,非常有必要了解一下.mtl文件的一些信息

***.mtl文件介绍:
该资源文件描述是贴图图片以及颜色等材质信息。聪明的你一定发现了我们刚刚的关于资源文件的截图了,看到有.jpg和.png的两个图片文件了,对,是的,该图片就是被.mtl引用的(所以呢,如果在构建项目的时候,发现模型构建出来了,但是好像样式有些不对,也许就是你没有把图片资源也导入哦)。
好了,具体的介绍,请看官网的截图:

Paste_Image.png

ps:看到图中红色边框框选出来的部分了吗?对,这个东西在接下来的文章里,会告诉你这个的坑。(当然,如果你对obj足够了解的话,请忽略上述ps)。
(3.2)什么是模型组合:
有兴趣的,可以查阅官网(modeling建模手册http://www.hightopo.com/guide/guide/plugin/modeling/ht-modeling-guide.html
其实呢,在官网已经介绍的很详细,我就不重复了,我就挑项目中实际上需要关注的地方:
第一点:通过ht.Default.setShape3dModel(name, model)函数,可注册自定义3D模型;
第二点:
vs:顶点坐标数组
is:顶点索引数组
(4)接下来是具体代码的实现部分
(4.1)首先引入HT组件文件:

<script type="text/javascript" src="lib/core/ht.js"></script>
 <script type="text/javascript" src="lib/plugin/ht-modeling.js"></script>
   
为什么要引入这两个文件,这两个文件的作用是什么?
首先:第一个文件:是核心类库文件,包括:数据模型,数表通用组件,2D拓扑组件,矢量以及3D渲染引擎等核心组件。
第二个文件:导入OBJ格式功能需要引入ht-obj.js的插件扩展包;(在本例中不需要引入。)

接下来,我们来看看一些基础的代码:几乎涉及到 3D的的场景,这些代码都大同小异:

     //数据容器(datamodel手册)
    dataModel = new ht.DataModel();
    //定义3d渲染引擎组件(3d手册)
    g3d = new ht.graph3d.Graph3dView(dataModel);
    view =g3d.getView();
    view.className = 'main';                
    document.body.appendChild(view);
//监听图元变化,但是又不能在图元立马改变的时候就更新,而是每隔一段时
//间异步刷新
    window.addEventListener('resize', function(e) {
        g3d.invalidate();
        }, false);
//设置海平面
    g3d.setGridVisible(true);
//设置可编辑为true
    g3d.setEditable(true);
//设置观察视觉
    g3d.setEye([-82, 169, 327]);
//决定目标中心点
    g3d.setCenter([-8, 48, 8]);

//其实像这些属性,都不用自己来写的,大多数采用默认的就可以用了
getEye()|setEye([x, y, z]),决定眼睛(或Camera)所在位置,默认值为[0, 300, 1000]
getCenter()|setCenter([x, y, z]),决定目标中心点(或Target)所在位置,默认值为[0, 0, 0]
getUp()|setUp([x, y, z]),决定摄像头正上方向,该参数一般较少改动,默认值为[0, 1, 0]
getNear()|setNear(near),决定近端截面位置,默认值为10
getFar()|setFar(far),决定远端截面位置,默认值为10000
(4.2)把描述风扇和扇叶的顶点坐标和顶点索引信息加载进来(由于文件过大,本例只截取部分只说明原理)。

var windmill_base_positions = [0, -0.3600277900695801, 9.063931465148926, 0.34631508588790894, 0.9793881177902222, 8.812317848205566, 0, 0.9793879985809326, 9.063931465148926, 0.34631508588790894];
var windmill_base_indices = [0, 1, 2, 3, 4, 5, 6, 7];
var windmill_blades_positions = [-0.7316640019416809, -0.560940146446228, -0.15819978713989258, -0.4289890229701996, -0.4811832904815674, -0.03272248059511185, -0.42898908257484436];
var windmill_blades_indices = [0, 1, 2, 3, 4, 5, 6, 7];

//注册3d柱子模型:             
    ht.Default.setShape3dModel('zhuzi', {
            vs: windmill_base_positions_new,
            is: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
});
//注册3d扇叶模型:
ht.Default.setShape3dModel('fengshan', {
            vs: windmill_blades_positions_new,
            is: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
});
//组合模型:
    ht.Default.setShape3dModel('zuhe', [{
        shape3d: 'zhuzi',
        color:'red'
            }, {
        shape3d: 'fengshan',
        t3: [0, 175 / 20, 0],
        r3: {
            func: function(data) {
            return [0,0,data.a('angle')];//获取值显示。
            }
        },
        color:'yellow'
        }]);
/*这里我们来解释func。由于HT的独特设计,任何属性都可以通过对象方法func,来进行属性值得改变,那么这里又引申出dataModel了,因为不同view是共用一个dataModel的,所以,所有data的属性都可以进行关联。而func实际上是Data对象调用firePropertyChange(property, oldValue, newValue)触发属性变化从而派发属性变化事件,*/

通过以上代码,我们已经将JSON模型对象注册到系统。接下来通过node.setStyle('shape3d', 'zuhe')//设置需要显示为该模型效果的图元属性即可。如下代码:

        var node = new ht.Node();
                node.s3(10,10,10);
                node.s({
                    'shape3d': 'zuhe',                  
                });     
          dataModel.add(node);
/*
在nodo设置大小,width,height,tall值一样的,具体原因,我们下一章节在进行详细介绍。
*/

//通过interval改变风扇的angle值,从而从风扇动起来

        var angle = -Math.PI / 2;
    setInterval(function() {
                    angle += 0.1;
                    node.a('angle', angle);
                }, 10);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容