3D nunuStudio脚本开发入门

news2024/11/22 15:29:14

在 3D应用集成开发环境 nunuStudio 中,脚本是使用 javascript 语言编写的,javascript 是用于开发网页的语言,它是一种易于学习的语言,本教程不需要任何编程知识。 但我建议你在继续学习下一个教程之前学习 javascript 编程的基础知识。

1、nunuStudio脚本对象

脚本对象用于使用 javascript 代码控制对象,其行为方式与任何其他对象相同,它们具有位置、比例和旋转,它们可以有子对象并用作容器。

创建脚本对象后,可以通过双击对象资源管理器(右侧)中的脚本对象来打开脚本编辑器。 脚本编辑器在新选项卡中打开。 新脚本有一个基本的代码模板,其中包含用于编写代码的空格:
在这里插入图片描述

为了更容易访问程序元素,脚本还可以访问以下属性

  • self - 用于访问脚本对象属性(位置、旋转、缩放、子项等)。
  • program - 用于访问程序实例,可用于更改当前场景、访问资源(getMaterialByName、getTextureByName 等)。
  • scene - 用于访问正在运行的场景属性。
  • 键盘 - 提供对键盘输入的访问
  • 鼠标 - 提供对鼠标输入的访问

2、nunuStudio脚本函数

有一些保留的函数名称,供 nunuStudio 运行时用来运行脚本代码。在本教程中,我们将仅使用初始化、更新和处置方法。

  • initialize - 加载场景时调用 initialize 方法,它通常用于以编程方式创建新对象、从场景中获取对象、初始化变量等。
  • update - 在将场景绘制到屏幕之前调用每一帧,它可用于控制对象、获取输入值、更改对象属性等。
  • dispose - 在程序关闭时调用,应该用于清理对象、断开与数据流的连接等。
  • onMouseOver(objects) - 当鼠标悬停在脚本对象的子对象上时调用,可以与鼠标函数结合使用以检查是否单击了对象。接收到一个对象数组作为参数。
  • onResize(x, y) - 每次调整程序窗口大小时调用。
  • onAppData(data) - 用于从主机页面接收数据,数据作为参数接收。

3、用脚本移动3D对象

要移动一个对象,我们首先将该对象附加为脚本对象的子对象,我们可以通过将所需对象拖动到脚本对象来实现,在本教程中,我们将在默认场景中使用立方体对象。 让我们从测试以下代码开始:

function initialize()
{
self.position.x += 2;
}

程序启动后,上述代码会将立方体沿 x 轴移动 2 个点,但是,移动对象后,它会留在原地。

要为对象设置动画,我们可以将代码移至更新方法,而不是使用对象位置,让我们尝试通过测试以下代码来更改其旋转。

function update()
{
self.rotation.y += 0.01;
}

如果一切都按预期工作,你应该会看到以下动画。 要在编辑器中试用此示例,你可以下载项目文件或在 Web 编辑器上打开它:
在这里插入图片描述

4、键盘和鼠标输入

可以使用键盘和鼠标来移动对象。 这可以使用脚本中的键盘和鼠标对象来完成。 下面的代码使用鼠标增量在 y 轴上旋转对象,并使用键盘箭头键移动对象。

function update()
{
self.rotation.y += Mouse.delta.x * 0.01;

if(Keyboard.keyPressed(Keyboard.LEFT))
{
	self.position.x -= 0.1;
}
if(Keyboard.keyPressed(Keyboard.RIGHT))
{
	self.position.x += 0.1;
}
}

如果一切正常,你应该能够使用键盘箭头键移动立方体并使用鼠标旋转它,如下所示。 要在编辑器中试用此示例,可以下载项目文件或在 Web 编辑器上打开它:
在这里插入图片描述

5、获取对象

可以使用脚本访问其他对象和资源,在下面的示例中,如果找到多个具有相同名称的对象,我们使用 scene.getObjectByName() 方法通过名称获取对象(在本例中为名为 box 的对象) 。

资源存储在程序中,类似的方法 program.getMaterialByName()、program.getTextureByName() 等可用于获取它们(查看 ResourceManager API 文档页面以获取更多信息)。

var object;

function initialize()
{
object = scene.getObjectByName("box");
}

function update()
{
object.rotation.y += 0.01;
}

另一种访问对象的方法是通过导航树结构,每个对象都有父对象和子对象,父对象指向上面的对象,子对象是下面所有对象的数组。

在下面的代码中,我们将第一个对象放在脚本中并使其旋转而不旋转脚本本身。 直接访问子对象或父对象时要小心,因为这取决于对象在项目中的位置,更改可能会破坏代码。

var object;

function initialize()
{
object = self.children[0];
}

function update()
{
object.rotation.y += 0.01;
}

6、切换场景

可以在编辑器中创建多个场景并使用脚本在它们之间切换。 可以从所有脚本都可以访问的程序变量访问场景。 setScene() 方法丢弃当前场景并加载一个新场景,它接收场景名称或场景对象(存储在 program.scenes 数组中)作为参数

按下键盘上的 W 键后,可以使用以下代码切换到“场景 2”。 要返回原始场景,scene2 必须实现类似的逻辑,没有自动场景导航流程。

function update(delta)
{
if(Keyboard.keyPressed(Keyboard.W))
{
	program.setScene("scene2");
}
}

7、对象属性

脚本对象中的自指针可用于存储其他脚本可以访问的附加属性。 属性也可以存储到对象中,注意避免与 nunuStudio API 提供的现有属性发生冲突。

在下面的示例中,我们创建了一个附加到脚本对象的计数器变量和一个可以被其他脚本访问和调用的 increaseCounter 函数。

self.counter = 0;

self.increaseCounter = function()
{
self.counter++;
}

8、DOM 元素

可以将 dom 元素附加到创建的程序中。 为此,我们可以使用程序的 division 属性,该属性使我们可以访问 DOM division 元素(用于绘制内容的 canvas 元素的父元素),我们可以在其中添加 HTML 元素。

下面的示例演示了如何创建一个大小为 50 x 50 的新红色分区,将其添加到程序中并在程序关闭时将其删除。

var element = document.createElement("div");
element.style.width = "100px";
element.style.height = "100px";
element.style.position = "absolute";
element.style.top = "0px";
element.style.backgroundColor = "#FF0000";

function initialize()
{
	program.division.appendChild(element);
}

function dispose()
{
	program.division.removeChild(element);
}

9、库

要首先将外部库添加到您的脚本,需要将 js 文件导入到项目中。只需将 JS 源文件拖到资产资源管理器中或转到导入/文本并选择 js 文件。
在这里插入图片描述

将文件导入项目后,现在可以使用代码顶部的 include(name) 方法将其包含在脚本中。 默认情况下有多种包含模式可用,脚本对象使用评估模式,库在脚本上下文中评估和执行,追加模式将库的代码附加到脚本代码之上,这使得编译速度稍慢但本地定义 代码对你的脚本可用。 可以在脚本对象面板中选择脚本模式。

include("moment.min.js"); //https://momentjs.com/
// include("https://momentjs.com/downloads/moment.min.js");

var date, hour;

function initialize()
{
date = program.getObjectByName("date");
date.setText(moment().format("MMM Do YY"));

hour = program.getObjectByName("hour");
}

function update()
{
var text = moment().format('LTS');
if(text !== hour.text)
{
	hour.setText(text);
}
}

function dispose()
{
delete moment;
}

上面的代码演示了如何使用 moment.js 在文本对象上显示日期和时间。 该库可在 https://momentjs.com/ 免费获得。 要在编辑器中试用此示例,可以下载项目文件或在 Web 编辑器上打开它。


原文链接:NunuStudio脚本开发入门 -— BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSP | oa项目增加用户登录的功能

目录 一:实现用户登录的功能 (1)当前oa应用还存在的问题? (2)实现登录功能? (3)最终达到的结果? (4)目前存在的问题?…

ASEMI-GBU808整流桥如何测好坏

编辑-Z 整流桥是将交流转化为直流的集成电路设备,主要用于开关电源或逆变电源的整流电路。接下来,让我们了解GBU808整流桥,以及GBU808整流桥如何测好坏的方法。 整流桥GBU808的结构 整流桥GBU808有四只脚分别是AC输入两只脚,用符…

​win10下安装 RabbitMQ​

下载安装包:RabbitMQ-Windows版.7z-Java文档类资源-CSDN下载 下载RabbitMQ一定要保持 Erlang 和 RabbitMQ 的版本匹配 1、安装 Erlang 安装 RabbitMQ 之前需要先安装 Erlang 环境 Erlang 下载地址 https://www.erlang.org/downloads 2、安装 RabbitMQ RabbitMQ 下…

【网络层】RIP协议详解(应用层)、慢收敛、OSPF协议(适合大网络)

注:最后有面试挑战,看看自己掌握了吗 文章目录路由选择分类RIP--距离向量路由选择------简单-------每个路由器维护一个到其他的最佳距离向量记录---------跳数最少-----RIP距离最高16(不可达)最多15个网络-------只适合小的互联网…

Springboot集成activiti7

在pom文件中添加SpringBoot集成Activiti7的依赖 <!--添加activiti和SpringBoot整合的依赖内置的MyBatis版本与外面的会有冲突&#xff0c;所以需要排除--> <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-start…

毕业设计-深度学习身份证号码检测识别-python-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

Spring Security HTTP认证

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 HTTP提供了用户权限控制和认证的通用方式&#xff0c;这种认证方式通过HTTP请求头来提供认证信息&#xff0c;而不是通过表单…

[附源码]计算机毕业设计基于Springboot校园运动会管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

opencv c++ 霍夫圆检测

1、原理 a&#xff09;对某点&#xff0c;以其为圆心的圆为无数&#xff08;一圈圈的圆&#xff09;&#xff0c;将其从x-y平面坐标系上转换到r-θ极坐标系上后&#xff0c;则变成了以r、θ为自变量&#xff0c;为固定值&#xff0c;x、y为因变量的式子&#xff1a; b&#xff…

一文带你走进JS语法(最全笔记)

目录 基本语法 1.引入方式 2.注释 3.输入输出语句 4.变量和常量 5.原始数据类型 6.运算符 7.流程控制语句 8.数组 9.函数 DOM 1.概述 2.元素对象的操作 3.元素内属性操作 4.元素内文本操作 事件 面向对象 1.定义类的方式 2.继承 内置对象 1.Number对象 2…

matlab贝叶斯隐马尔可夫hmm模型实现

贝叶斯隐马尔可夫模型是一种用于分割连续多变量数据的概率模型。该模型将数据解释为一系列隐藏状态生成。每个状态都是重尾分布的有限混合&#xff0c;具有特定于状态的混合比例和共享的位置/分散参数。 相关视频&#xff1a;马尔可夫链原理可视化解释与R语言区制转换Markov r…

java面试总结

文章目录JVM类的加载过程类加载器有哪些什么是双亲委派双亲委派的好处如何打破双亲委派java内存模型栈帧的结构java堆的分代设计对象内存分配对应的GC为什么需要Survivor区?只有Eden不行吗&#xff1f;为什么要有两个Survivor区对象创建过程对象内存布局对象头Mark Word对象大…

提高 K8S 容器运行时的可观察性最佳方法之一

当谈到云原生可观察性时&#xff0c;可能每个人都会提到OpenTelemetry (OTEL)&#xff0c;因为社区需要依赖标准来将所有集群组件开发指向到同一方向。OpenTelemetry 使我们能够将日志、指标&#xff08;metrics&#xff09;、跟踪&#xff08;traces&#xff09;和其他上下文信…

内容爆炸时代,如何打造品牌经营的“弹药库”?

&#x1f446;点击一键预约本周三主题直播&#x1f446;2017年&#xff0c;华为总裁办发布《华为之熵&#xff0c;光明之矢》的内部学习邮件&#xff0c;将热力学中“熵”的概念应用到企业管理中&#xff0c;成为被人们津津乐道的“熵减哲学”。对于“熵”的概念&#xff0c;大…

[附源码]计算机毕业设计基于vuejs的文创产品销售平台app

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计甜品购物网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【OpenCV-Python】教程:4-2 Harris角点检测

OpenCV Python Harris 角点检测 【目标】 理解Harris角点检测背后的概念&#xff1b;cv2.cornerHarris(), cv2.cornerSubPix() 【理论】 上一章节中&#xff0c;我们看到在图像中每个方向变化都很大的区域就是角点&#xff0c;一个早期的尝试是由 Chris Harris & Mike …

关闭图片窗口

关闭图片窗口 结果演示 概述 通过事件的绑定来实现&#xff0c;关闭网页中某个图片窗口的效果。 构建HTML框架 <body><div class"box">图片<img src"https://upload-bbs.mihoyo.com/upload/2021/03/11/73281682/f810fbc2e4806aab8176e96feee…

关于数据分析知识的干货分享

数据分析的出现是因为人类难以理解海量数据所呈现出来的信息&#xff0c;不能从中找到相应的规律来对现实中的事物进行对应&#xff0c;我们都知道数据有很高的价值&#xff0c;但不能利用的价值&#xff0c;没有任何意义。 为了解决这一问题&#xff0c;数据分析在长期的数据…

超透镜与超表面全息

超透镜和超表面因其操纵电磁场的独特特性而在科学上声名鹊起&#xff0c;如今它们的制造已经变得可行。但它们的设计难度远远超过了传统镜片&#xff0c;因为必须考虑到纳米级构件的特性。 VirtualLab Fusion的优势  统一的平台&#xff1a;具有将纳米级构建模块和大尺…