数百个 HTML5 例子学习 HT 图形组件 – 3D建模篇

http://www.hightopo.com/demo/pipeline/index.html

数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇》里提到 HT 很多情况下不需要借助 3Ds Max 和 Blender 等专业 3D 建模工具也能做出很多效果,例如  http://www.hightopo.com/guide/guide/core/3d/examples/example_3droom.html 这个 3D 电信机房监控例子整个都是通过 HT 提供的 API 构建而成:

不过这个例子中的模型都比较规矩,也就消防栓由一个球 + 圆通构成,其他图形通过 HT 提供的基本 Node 以及 Shape 对象即可搞定:

但这并不意味着 API 只能做简单的模型,《HT for Web 建模手册》中介绍的 HT 建模插件可以让有想象力的同学做出各种不可思议的效果。例如这个餐座椅的例子:http://www.hightopo.com/guide/guide/plugin/modeling/examples/example_custommodel.html

对于这个餐座椅的例子,特别是一些不规则的花盆、酒杯、圣诞树和那颗爱心,很多人好奇我们是怎么搞出来的。其实蛮简单,就用了《HT for Web 建模手册》中的 createRingModel 和 createExtrusionModel 两个构建模型的函数,其中 createRingModel 顾名思义用来构建围绕一圈的环状模型,createExtrusionModel 用来构建基于某个形状的凸出效果,这两个函数生成的 3D 模型都是靠平面的 2D 图形衍生而来,都是靠 HT 系统中构建 2D 不规则多边形时采用的 Points 和 Segments 两个数组参数搞定, Points 和 Segments 的意义可参考 《HT for Web 形状手册》:

可生成不规则的 3D 地板:http://www.hightopo.com/guide/guide/core/shape/examples/example_floor.html

可生成不规则的 3D 管线:http://www.hightopo.com/guide/guide/core/shape/examples/example_polyline.html

这样大家应该理解了原理,但餐座椅的那几个不规则形状的 magic 参数是如果得来的呢,这还是得借助辅助工具:http://www.hightopo.com/demo/3dmodel/index.html

这个工具多年前为写例子随意搞的,代码挺简单大家直接看 http://www.hightopo.com/demo/3dmodel/index.html 源代码即可,写的比较简陋但挺实用,如何导出?打开控制台,自己打印出 shape 对象的 sements 和 points 参数即可,或等我有空了再来写个可导入导出更完整的例子,或者 you can you up?

其实也不仅仅也用于 Node 节点类型对象的建模,对于连线其实也可以用模型来搞定,例如http://www.hightopo.com/guide/guide/plugin/forcelayout/examples/example_forcelayout3.html这个 3D 弹力拓扑图例子,很多人已经觉得挺酷炫了,但我一直对这呆板规矩的管道连线很不爽,于是突发奇想搞了个像狗骨头似的两头粗中间细的连线效果,整个 3D 拓扑图例子一下子高大上了许多:

http://www.hightopo.com/demo/pipeline/index.html

这个例子原理是这样的,将连线 Edge 设置成透明不可见的,然后针对每个 Edge 对应一个 Node 节点,这个节点的形状就是被拉伸并定位到连线位置替代连线来显示,而 Node 图形在还没拉伸之前长得如下:

这里还有个细节是通过 createMatrix 函数,为每个管线设置一个指向两节点位置的矩阵坐标变换参数到 style 的 mat 属性上,矩阵预算不理解也没关系,直接照抄例子中代码即可,为了方便大家理解我搞了个两个节点一条连线更简单的例子供参考:

今天只是抛砖引玉,《HT for Web 建模手册》中还有众多 API 函数,只要有想象力还可以折腾出无数的花样,后续有空我再借助 HT for Web的 WebGL 3D 自定义建模功能多搞些实用的例子。

http://www.hightopo.com/demo/pipeline/index.html

ht.Default.setShape3dModel(
    ‘custom‘, ht.Default.createRingModel(
        [0.5, 0.5, -0.2, 0, 0.5, -0.5], [1, 3]
    )
);

var colorList = [‘#FFAFA4‘, ‘#B887C5‘, ‘#B9EA9C‘, ‘#CFD9E7‘, ‘#4590B8‘, ‘#FF9C30‘],
    colorLen = colorList.length;
var randomColor = function() {
    var ran = Math.random() * colorLen;
    return colorList[Math.floor(ran)];
};

var init = function() {
    var dm = new ht.DataModel(),
        g3d = window.g3d = new ht.graph3d.Graph3dView(dm);
    g3d.getBrightness = function() { return null; };
    g3d.isMovable = function(node) { return node.s(‘shape3d‘) !== ‘custom‘; };
    g3d.addToDOM();

    var edgeList = initDataModel(dm),
        forceLayout = new ht.layout.Force3dLayout(g3d);
    forceLayout.onRelaxed = function() {
        edgeList.forEach(updatePipeline);
    };
    forceLayout.start();

    initFormPane(g3d);
};

var initDataModel = function(dm) {
    var root = createNode(dm),
        iNode, jNode, j,
        edgeList = [];
    for (var i = 0; i < 3; i++) {
        iNode = createNode(dm);
        edgeList.push(createEdge(dm, root, iNode));

        for (j = 0; j < 3; j++) {
            jNode = createNode(dm);
            edgeList.push(createEdge(dm, iNode, jNode));
        }
    }
    return edgeList;
};

var createNode = function(dm) {
    var node = new ht.Node();
    node.s({
        ‘shape3d‘: ‘sphere‘,
        ‘shape3d.color‘: randomColor()
    });
    node.s3(40, 40, 40);
    dm.add(node);
    return node;
};

var createEdge = function(dm, node1, node2) {
    var node = new ht.Node();
    node.s({
        ‘shape3d‘: ‘custom‘,
        ‘shape3d.color‘: ‘#ECE0D4‘,
        ‘layoutable‘: false
    });
    dm.add(node);

    var edge = new ht.Edge(node1, node2);
    edge.a(‘pipeline‘, node);
    edge.s(‘edge.color‘, ‘rgba(0, 0, 0, 0)‘);
    dm.add(edge);

    return edge;
};

var updatePipeline = function(edge) {
    var pipeline = edge.a(‘pipeline‘);
    pipeline.s3(1, 1, 1);
    pipeline.p3(0, 0, 0);

    var node1 = edge.getSourceAgent(),
        node2 = edge.getTargetAgent();
    pipeline.s(‘mat‘, createMatrix(node1.p3(), node2.p3(), 20));
};

var createMatrix = function(p1, p2, width) {
    var vec = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]],
        dist = ht.Default.getDistance(p1, p2);
    return ht.Default.createMatrix({
        s3: [width, dist, width],
        r3: [Math.PI/2 - Math.asin(vec[1]/dist), Math.atan2(vec[0], vec[2]), 0],
        rotationMode: ‘xyz‘,
        t3: [(p1[0]+p2[0])/2, (p1[1]+p2[1])/2, (p1[2]+p2[2])/2]
    });
};

var initFormPane = function(g3d) {
    var formPane = new ht.widget.FormPane();
    formPane.setWidth(230);
    formPane.setHeight(125);
    formPane.addToDOM();

    var view = formPane.getView();
    view.style.background = ‘rgba(186, 186, 186, 0.7)‘;
    view.style.top = ‘10px‘;
    view.style.left = ‘auto‘;
    view.style.right = ‘7px‘;

    formPane.addRow([{ element: ‘Headlight:‘, font: ‘bold 12px arial, sans-serif‘ }, {
        id: ‘disable‘,
        checkBox: {
            label: ‘disable‘,
            value: g3d.isHeadlightDisabled(),
            onValueChanged: function(oV, nV) {
                g3d.setHeadlightDisabled(nV);
            }
        }
    }], [70, 0.1]);
    formPane.addRow([], [0.1], 1.01, {background: ‘#43AFF1‘});

    [‘Color‘, ‘Range‘, ‘Intensity‘].forEach(function(name) {
        var obj = { id: name },
            func = function(oV, nV) {
                g3d[‘setHeadlight‘ + name](nV);
            };
        if (name === ‘Color‘)
            obj.colorPicker = {
                instant: true,
                value: g3d[‘getHeadlight‘ + name](),
                onValueChanged: func
            };
        else
            obj.slider = {
                min: 0,
                max: name === ‘Range‘ ? 20000 : 3,
                step: 0.1,
                value: g3d[‘getHeadlight‘ + name](),
                onValueChanged: func
            };
        formPane.addRow([ name, obj ], [ 70, 0.1 ]);
    });
};
时间: 2024-07-28 20:25:32

数百个 HTML5 例子学习 HT 图形组件 – 3D建模篇的相关文章

数百个 HTML5 例子学习 HT 图形组件 – 3D 建模篇

http://www.hightopo.com/demo/pipeline/index.html <数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇>里提到 HT 很多情况下不需要借助 3Ds Max 和 Blender 等专业 3D 建模工具也能做出很多效果,例如  http://www.hightopo.com/guide/guide/core/3d/examples/example_3droom.html 这个 3D 电信机房监控例子整个都是通过 HT 提供的 AP

数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇

<数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇>一文让读者了解了 HT的 2D 拓扑图组件使用,本文将对 HT 的 3D 功能做个综合性的介绍,以便初学者可快速上手使用 HT 构建例如电信网管 3D 机房应用.水务燃气 SCADA 监控应用及智能楼宇等应用场景. HT for Web 的 3D 是完全基于 WebGL 技术实现的渲染引擎,但开发者几乎不需要了解 3D 图形数学或 Shader 渲染的底层技术,只需要掌握基本的 3D 坐标系和相机  Camera 的概念,剩下需要掌

数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇

HT 是啥:Everything you need to create cutting-edge 2D and 3D visualization. 这口号是当年心目中的产品方向,接着就朝这个方向慢慢打磨,如今 HT 算是达到了这样的效果,谈不上用尽洪荒之力,但我们对产品结果很满意,特别是 HT 的用户手册,将例子和文档无缝融合一体,小小 10 来兆开发包居然包含了四十五份手册,数百个活生生的 HTML5 例子,还没体验过的同学可以点击 http://www.hightopo.com/guide/

HTML5 例子学习 HT 图形组件

HTML5 例子学习 HT 图形组件 HT 是啥:Everything you need to create cutting-edge 2D and 3D visualization. 这口号是当年心目中的产品方向,接着就朝这个方向慢慢打磨,如今 HT 算是达到了这样的效果,谈不上用尽洪荒之力,但我们对产品结果很满意,特别是 HT 的用户手册,将例子和文档无缝融合一体,小小 10 来兆开发包居然包含了四十五份手册,数百个活生生的 HTML5 例子,还没体验过的同学可以点击 http://www.

HT图形组件设计之道(三)

上篇我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动,这类案例后续文章还会继续以便大家掌握更多的矢量应用场景,本篇我们先切换个话题,谈谈模型-视图-事件之间的关系. 图形组件设计架构上主要就是在规划Data模型,View视图和Event事件之间的关系,这些年业界逐渐将各种GUI设计模式提炼成理论归类,MVC.MVP和MVVM的主要大类常被统称为MV*,有很多文章进行各种设计模式的定义和比较,本篇不打算深入展开理论的讨论,不同图形

HT图形组件设计之道(二)

上一篇我们自定义CPU和内存的展示界面效果,这篇我们将继续采用HT完成一个新任务:实现一个能进行展开和合并切换动作的刀闸控件.对于电力SCADA和工业控制等领域的人机交互界面常需要预定义一堆的行业标准控件,以便用户能做可视化编辑器里,通过拖拽方式快速搭建具体电力网络或工控环境的场景,并设置好设备对应后台编号等参数信息,将拓扑图形与图元信息一并保存到后台,实际运行环境中将打开编辑好的网络拓扑图信息,连接后台实时数据库,接下来就是接受实时数据库发送过来的采集信息进行界面实时动态刷新,包括用户通过客户

HT图形组件设计之道(四)

在<HT图形组件设计之道(二)>我们展示了HT在2D图形矢量的数据绑定功能,这种机制不仅可用于2D图形,HT的通用组件甚至3D引擎都具备这种数据绑定机制,此篇我们将构建一个3D飞机模型,展示如果将数据绑定机制运用于3D模型,同时会运用到HT的动画机制,以及OBJ 3D模型加载等技术细节,正巧赶上刚发布的iOS8我们终于能将基于HT for Web开发的HTML5 3D应用跑在iOS系统了. 首选我们需要一个飞机模型,采用HT for Web构建3D模型可采用API组合各种基础模型的方式,但今天

HT图形组件设计之道

咱们号码大全经过定制了CPU和内存展示关键词挖掘工具界面,体会了HT for Web经过界说矢量完成图形制作与事务数据的代码解耦及绑定联动,这类事例后续文章还会持续以便咱们把握更多的矢量使用场景,本篇咱们先切换个论题,谈谈模型-视图-事情之间的联系. 图形组件计划架构上首要即是在计划Data模型,View视图和Event事情之间的联系,这些年业界逐步将各种GUI计划形式提炼成理论归类,MVC.MVP和MVVM的首要大类常被统称为MV*,有许多文章进行各种计划形式的界说和对比,本篇不计划深化翻开理

HT图形组件设计之道(一)

HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方式.正如Hightopo官网所表达的我们希望提供:Everything you need to create cutting-edge 2D and 3D visualization. 这个愿景从功能上是个相当长的战线,从设计架构上也是极具挑战性的,事实上HT团队是很保守的,我们从不贪多图大,仅仅做我们感觉自己能得更好,能给用户综合体验更佳的功能,在这样理念驱动下我们慢慢形成了这种愿景,慢慢实现了几个有意义