在Verge3D应用中使用JavaScript

借助拼图的优良特性,您可以无需写任何代码即实现常规WebGL应用中的大多数功能。但在某些特殊情况下,您依然需要使用JavaScript——比如,整合第三方编程库,或实现一些仅用拼图无法实现的重要特性。

方法#1(基础)

在拼图中合并JavaScript代码的最简单的方法是使用一个特殊拼图:exec script。它有一个内置的功能齐全的文本编辑器,能够进行语法高亮显示、语法检查、代码折叠和许多其他特性。

这个拼图所做的就是立即执行一个JavaScript代码片段。使用"exec script"的优点是:

为了从"exec script"内部访问变量过程拼图,您可以使用 VARSPROC 内置功能。请参阅exec script文档了解更多详情。

如下示例使用"exec script"拼图实现了在场景中点击对象时改变材质的功能:

用拼图执行JavaScript

方法#2(标准)

如果您想拥有比"exec script"拼图所能提供的更多的控制权,那么此方法适合您。它使用默认的 Standard 应用模板(Standard LightStandard Dark):

标准应用模板

假设您使用应用管理器(默认配置选项)创建了一个名为 my_awesome_app 的应用。转到 applications 文件夹,然后进入 my_awesome_app 文件夹,使用您最喜欢的文本编辑器打开JavaScript文件 my_awesome_app.js

您可以使用任何文本编辑器添加JavaScript代码,但如果您的编辑器支持语法高亮和行号显示(如Notepad++或VS Code),会更加方便。

搜索"runCode"——此位置在文件中应该如下所示:

function runCode(app, puzzles) { // add your code here, e.g. console.log('Hello, World!'); }

您可以在其声明内部(在花括号之间)添加代码,如下所示:

function runCode(app, puzzles) { // add your code here, e.g. console.log('Hello, World!'); console.log('Just added some JavaScript!'); }

现在,保存 .js 文件并运行应用,在打开浏览器控制台之前不会看到任何反应。浏览器控制台通常可以用F12键(Windows/Linux上的Chrome、Firefox)打开。在Mac电脑中,Chrome使用 View → Developer → JavaScript Console 菜单(快捷键:⌥-⌘-J),Safari使用 Develop → Show Error Console 菜单(快捷键:⌥-⌘-C)。

在浏览器控制台中查看脚本输出

通过代码您可以对场景做一些改变,比如移动默认的Verge3D立方体(在Blender中名为"Cube",在3ds Max中名为"Box001",在Maya中名为"pCube1")...

function runCode(app, puzzles) { const obj = app.scene.getObjectByName('Cube'); obj.position.x = 2; }

...或者凭空创造一种新材质:

function runCode(app, puzzles) { const obj = app.scene.getObjectByName('Cube'); obj.material = new v3d.MeshPhongMaterial({ color: '#00BB00', emissive: '#550000' }); } 用JavaScript更改材质

有关在Verge3D应用中使用JavaScript的更多信息,请参阅程序员指南

方法#3(紧凑型)

这种方法适合有经验的程序开发人员,希望从一个最小的工作代码片段开始工作。流程与 Standard 模板类似,但这次我们选择 Code-Based 模板来创建新应用:

基于代码的应用模板

这将预设一个更简单的项目基础结构,应用中不会附带拼图编辑器,对应的 .js 文件里也只包含短短几行代码:

'use strict'; const CONTAINER_ID = 'v3d-container'; const SCENE_URL = 'template.gltf'; const preloader = new v3d.SimplePreloader({ container: CONTAINER_ID }); const app = new v3d.App(CONTAINER_ID, null, preloader); app.loadScene(SCENE_URL, () => { app.enableControls(); app.run(); runCode(); }); function runCode() { // add your code here, e.g. console.log('Hello, World!'); }

此类应用非常简单,但它们仍然能够加载 .gltf 格式的场景文件(带预加载器),并为用户提供标准摄影机控件。

您可以按照方法#2中的描述在"runCode"函数中添加代码来继续编程。当然,您也可以完全重构此应用模板:用自己的实现替换App类,使用不同的3D文件格式加载场景,或以某种特定方式设置控件。

方法#4(硬核)

这种方法适合熟悉Three.js库的程序员,因为其API与Verge3D中使用的API类似。

从Verge3D安装路径的 build 文件夹复制 v3d.js 文件,将其链接到 .html 文件,然后开始编程吧!此外,还有一个NPM包可供使用。

与拼图交互

除了exec script之外,Verge3D还提供以下拼图与JavaScript之间的交互方式:

从拼图调用JavaScript过程
正确定义的JavaScript过程可以通过call external function拼图由拼图执行。
从JavaScript调用拼图过程
任何过程拼图都可以通过使用 puzzles 命名空间从JavaScript触发。请参阅此处了解更多信息。
消息传递
此方法可用于跨域(多主机)环境。要从拼图向JavaScript发送消息,您可以使用call method / postMessage拼图。要捕获从JavaScript发送的消息,请使用on event of拼图在 window 对象上注册 "message" 处理程序。

从拼图中获得灵感

这不是一种方法,而是一种提示。事实上,当您每次单击拼图编辑器中的 Save 按钮时,它都将生成一个自包含的、人类可读的JavaScript模块,并以 visual_logic.js 命名保存在您的应用文件夹中。

查看拼图代码

这样,您就有了一个对应特定JavaScript API方法工作原理的可运行示例,即并可重新使用自己感兴趣的拼图所生成的代码片段。

遇到问题?

欢迎您随时在 论坛上提问!您还可以加入中文用户社区QQ群(171678760),在线寻求帮助。