【实例简介】

【实例截图】

【核心代码】

WebViewer - STL

var container;

var camera, cameraTarget, scene, renderer;

var cameraType = 1;

var perspectiveAngle = 45;

var cameraPosX = 200;

var cameraPosY = 200;

var cameraPosZ = 200;

var cameraTargetX = 0;

var cameraTargetY = 0;

var cameraTargetZ = 0;

var upVectorX = 0;

var upVectorY = 1;

var upVectorZ = 0;

var cameralScale = 5;

init();

animate();

function getQueryStringByName(name){

var result = location.search.match(new RegExp("[\?\&]" name "=([^\&] )","i"));

if(result == null || result.length < 1){

return "";

}

return result[1];

}

function init() {

container = document.createElement( 'div' );

document.body.appendChild( container );

// set camera

var cameraTypeStr = getQueryStringByName('cameraType');

cameraType = cameraTypeStr == "" ? cameraType : parseInt(cameraTypeStr);

var perspectiveAngleStr = getQueryStringByName('perspectiveAngle');

perspectiveAngle = perspectiveAngleStr == "" ? perspectiveAngle : parseFloat(perspectiveAngleStr);

var cameraPosXStr = getQueryStringByName('cameraPosX');

cameraPosX = cameraPosXStr == "" ? cameraPosX : parseFloat(cameraPosXStr) * cameralScale;

var cameraPosYStr = getQueryStringByName('cameraPosY');

cameraPosY = cameraPosYStr == "" ? cameraPosY : parseFloat(cameraPosYStr) * cameralScale;

var cameraPosZStr = getQueryStringByName('cameraPosZ');

cameraPosZ = cameraPosZStr == "" ? cameraPosZ : parseFloat(cameraPosZStr) * cameralScale;

var cameraTargetXStr = getQueryStringByName('cameraTargetX');

cameraTargetX = cameraTargetXStr == "" ? cameraTargetX : parseFloat(cameraTargetXStr) * cameralScale;

var cameraTargetYStr = getQueryStringByName('cameraTargetY');

cameraTargetY = cameraTargetYStr == "" ? cameraTargetY : parseFloat(cameraTargetYStr) * cameralScale;

var cameraTargetZStr = getQueryStringByName('cameraTargetZ');

cameraTargetZ = cameraTargetZStr == "" ? cameraTargetZ : parseFloat(cameraTargetZStr) * cameralScale;

var upVectorXStr = getQueryStringByName('upVectorX');

upVectorX = upVectorXStr == "" ? upVectorX : parseFloat(upVectorXStr) * cameralScale;

var upVectorYStr = getQueryStringByName('upVectorY');

upVectorY = upVectorYStr == "" ? upVectorY : parseFloat(upVectorYStr) * cameralScale;

var upVectorZStr = getQueryStringByName('upVectorZ');

upVectorZ = upVectorZStr == "" ? upVectorZ : parseFloat(upVectorZStr) * cameralScale;

if(cameraType == 0) {

camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, 1, 10000 );

}

else {

camera = new THREE.PerspectiveCamera( perspectiveAngle, window.innerWidth / window.innerHeight, 1, 10000 );

}

camera.position.set( cameraPosX, cameraPosY, cameraPosZ);

camera.up.set(upVectorX, upVectorY, upVectorZ);

cameraTarget = new THREE.Vector3( cameraTargetX, cameraTargetY, cameraTargetZ );

camera.lookAt( cameraTarget );

scene = new THREE.Scene();

scene.fog = new THREE.Fog( 0xffffff, 1, 10000 );

// load file

var loader = new THREE.STLLoader();

var modelName = getQueryStringByName('modelName');

loader.load( '../Models/' modelName, function ( geometry ) {

var material = new THREE.MeshPhongMaterial( { color: 0x808080, specular: 0x111111, shininess: 200 } );

var mesh = new THREE.Mesh( geometry, material );

mesh.castShadow = true;

mesh.receiveShadow = true;

scene.add( mesh );

} );

// lights

scene.add( new THREE.AmbientLight( 0x333333 ) );

addDirectionalLight(-1, 1, 1, 0xFFFFFF, 1.35);

addDirectionalLight(1, -1, -1, 0xFFFFFF, 1);

// renderer

renderer = new THREE.WebGLRenderer( { antialias: true } );

renderer.setClearColor( scene.fog.color );

renderer.setSize( window.innerWidth, window.innerHeight );

renderer.gammaInput = true;

renderer.gammaOutput = true;

renderer.shadowMapEnabled = true;

renderer.shadowMapCullFace = THREE.CullFaceBack;

container.appendChild( renderer.domElement );

// orbit control

control = new THREE.OrbitControls( camera, renderer.domElement );

// events

window.addEventListener( 'resize', onWindowResize, false );

}

function addDirectionalLight( x, y, z, color, intensity ) {

var directionalLight = new THREE.DirectionalLight( color, intensity );

directionalLight.position.set( x, y, z )

scene.add( directionalLight );

}

function onWindowResize() {

camera.aspect = window.innerWidth / window.innerHeight;

camera.updateProjectionMatrix();

renderer.setSize( window.innerWidth, window.innerHeight );

}

function animate() {

requestAnimationFrame( animate );

render();

}

function render() {

//var timer = Date.now() * 0.0005;

//

//camera.position.x = Math.cos( timer ) * 3;

//camera.position.z = Math.sin( timer ) * 3;

renderer.render( scene, camera );

}

stl文件html预览,【stl文件在线预览】示例源码相关推荐

  1. uniapp - 超详细录音上传功能,点击开始录音 / 最后保存文件上传到服务器功能(附带详细示例源码及整个过程的实现方法,注释详细小白轻松上手改造)全端兼容!

    效果图 网上的教程太乱用不了,无法改造成自己想要的效果. 在uniapp中开发中,实现点击录音功能,并支持保存录音文件.uniapp编译后全平台兼容通用, 你可以直接复制示例源码,跟着教程一步步配置, ...

  2. Python Web在线考试管理系统【源码+毕设论文】

    本文参考之前Python+Django Web在线考试管理系统的博文,协助某同学完成的毕业设计论文. 有需要的同学请也可以自行参考以下系列文章: Python+Django Web在线考试管理系统设计 ...

  3. 前端【vue】实现文档在线预览功能,在线预览pdf、word、xls、ppt等office文件

    前端江太公 前端实现文档在线预览功能 最直接的就是使用XDOC 文档云服务 XDOC可以实现预览以DataURI表示的DOC文档,此外XDOC还可以实现文本.带参数文本.html文本.json文本.公 ...

  4. 基于java投标文件在线制作系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java投标文件在线制作系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java投标文件在线制作系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技 ...

  5. vue - element <upload> 组件批量上传文档,可携带其他表单数据项一同与文件 “手动提交“ 服务器(类似百度文库系统批量上传前端界面与逻辑)超详细教程示例源码,提供界面与逻辑完整源码

    效果图 本示例使用的是 element 组件库,其实什么组件库都行(逻辑是一样),只要你是 vue.js 项目就能使用本教程. 本文实现了 vue + element 使用 upload 组件批量上传 ...

  6. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码

    前言 最近由于工作和个人事务,站点也好久没更新了,但这并不影响我对.NET的热情.站点的更新工作还是得想办法抽时间来完成的. 提要 今天利用中午的时间来写一篇关于Asp.Net Web Api下载文件 ...

  7. [共享]一个文件上传的控件,绝对是精品源码

    [共享]一个文件上传的控件,绝对是精品源码 前段时候在www.codeproject.com上看到一个文件上传的控件,觉得很好,共享给园子里的朋友. 原文链接:http://www.codeproje ...

  8. springboot:实现文件上传下载实时进度条功能【附带源码】

    0. 引言 记得刚入行的时候,做了一个文件上传的功能,因为上传时间较久,为了用户友好性,想要添加一个实时进度条,显示进度.奈何当时技术有限,查了许久也没用找到解决方案,最后不了了之. 近来偶然想到这个 ...

  9. php - 基于 webuploader 视频大文件分片分段上传,支持断点续传(刷新、关闭页面、重新上传、网络中断等情况)带进度条,前端后端都有示例源码详细教程

    效果图 文件上传前先检测该文件是否已上传,如果已上传提示 "文件已存在",如果未上传则直接上传. 基于 php+webuploader的大文件分片上传,带进度条,支持断点续传(刷新 ...

  10. 基于mycncart开发PHP在线定制商城网站源码

    简介: PHP在线定制商城网站源码,免费开源.免费下载.本商城基于mycncart开发.安装成功后即可浏览,你可以在后台->安装扩展功能上传安装插件,在代码调整中点击刷新后系统会重新建立缓存,此 ...

最新文章

  1. 计算机编程免费ppt,计算机编程与C概述课件.ppt
  2. 连续处理函数reduce
  3. java基础---集合之HashSet
  4. linux mint 18.3浏览器,在Linux Mint 19/Ubuntu 18.04中安装Tor Browser浏览器的方法
  5. Python21天打卡Day14-随机字符串
  6. Windows防火墙增加访问端口
  7. python列表方法图解_python中list(列表)的使用方法总结(图文)
  8. c# textbox和listbox多行显示
  9. Maven—Eclipse中配置Maven
  10. python情感词提取_Python 文本挖掘:使用情感词典进行情感分析(算法及程序设计)...
  11. 等比数列求和python_Python科学计算
  12. 常用正则表达式(英文单词、数字、中文 、URL 、电话、身份证、输入内容必须以逗号隔开等)
  13. [OpenCV实战]39 在OpenCV中使用ArUco标记的增强现实
  14. SSD1306显示屏--躲避类游戏
  15. 皇甫懒懒 华清远见Java学习笔记-身份证校验
  16. sealos+rook 部署 kubeSphere+TiDB
  17. 华为任正飞关于“活下去”的呼声不断刷屏,《Android市场寒气十足,该如何存活》?
  18. 使用Python实现量化交易机器人定时启动或停止小工具
  19. 赵钟秋谈又拍网架构中的消息/任务系统
  20. U8资产变动怎么处理

热门文章

  1. tensorflow与pytorch 一起安装
  2. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
  3. 斐讯k1支持千兆吗_斐讯K2是不是千兆路由器
  4. 最长合法括号子序列(括号序列+贪心)
  5. DRM系列(7)之drmModeAtomicCommit底层流程
  6. springboot+校园招聘管理 毕业设计-附源码161815
  7. 常见的电商直播模式有哪些,你都了解过吗?
  8. C++项目和解决方案的区别
  9. 使用cmake搭建一个跨平台游戏服务器
  10. 定制一个erp系统多少钱-【揭秘erp开发报价及开发步骤】