MaxScript的Shape相关操作例子

news2024/9/28 23:44:46

MaxScript学习笔记目录

大家好,我是阿赵。之前有网友私信问了我一个相关的问题,我发现之前漏了MaxScript里面的Shape的内容,所以补一个例子,当做一个记录吧。

一、例子说明

这里做一个关于MaxScript读取二维形状(Shape)数据的例子,可能实际应用价值不是很大,因为3DsMax本身也带有这样的工具,不过作为一个例子来看看,留个记录,也算不错。
这个例子是这样的,有一条二维线条,然后做一个金字塔形状的网格模型
在这里插入图片描述

然后用MaxScript写一个工具,里面可以拾取二维线条,然后拾取模型,输入需要生成的数量,还有生成模型时的角度选择
在这里插入图片描述

点击create按钮,工具会复制指定的模型,沿着二维线条生成指定数量的模型。
比如上面的参数,生成500个模型,并且不改变模型的角度,得到的结果是这样的:
在这里插入图片描述

接下来改变一下角度的选项,可以生成这样的效果:
在这里插入图片描述

也可以选择反过来的角度,生成出这样的效果:
在这里插入图片描述

二、完整代码:

(
local CreateObjWin
local OnSelectShape
local OnSelectObj
local OnCreateObj
local selectedShape
local selectedObj
local ShowMsg
	
fn ShowMsg msg = 
(
	MessageBox msg title:"Tips"
)
	
fn OnSelectShape = 
(
	if $ == undefined then
	(
		selectedShape = undefined
	)
	else
	(
		local t = superclassof $
		if t == shape then
			selectedShape = $
		else
			selectedShape = undefined
	)
	if selectedShape == undefined then
		CreateObjWin.selectShapeTxt.text = "no selected shape"
	else		
		CreateObjWin.selectShapeTxt.text = selectedShape.name
)	

fn OnSelectObj = 
(
	if $ == undefined then
	(
		selectedObj = undefined
	)
	else
	(
		selectedObj = $
	)
	if selectedObj == undefined then
		CreateObjWin.selectObjTxt.text = "no selected shape"
	else		
		CreateObjWin.selectObjTxt.text = selectedObj.name
)

fn OnCreateObj num angleType = 
(
	if selectedShape == undefined then
	(
		ShowMsg "please select shape first!"
		return 0
	)
	if selectedObj == undefined then
	(
		ShowMsg "please select obj first!"
		return 0
	)
	
	local space = 1.0/(num-1);
	for i in 1 to num do
	(
		local tempObj = copy selectedObj
		local sp = space*(i-1)
		local pos = lengthInterp selectedShape sp
		
		if angleType >1 then
		(
			local rota = lengthTangent selectedShape sp	
			local angleDir = -1
			if angleType == 3 then
				angleDir = 1
			rota = rota * angleDir
			tempObj.rotation = quat rota.x rota.y rota.z 1
		)
		
		tempObj.pos = pos
		
	)
	
)

rollout CreateObjWin "CreateObjWin" width:246 height:300
(
	label 'lbl1' "shape:" pos:[17,30] width:40 height:17 align:#left
	label 'selectShapeTxt' "no selected shape" pos:[70,30] width:93 height:17 align:#left
	label 'lbl3' "obj:" pos:[16,63] width:40 height:17 align:#left
	label 'selectObjTxt' "no selected obj" pos:[70,63] width:93 height:17 align:#left
	label 'lbl5' "num:" pos:[17,99] width:40 height:17 align:#left
	edittext 'numInputBox' "" pos:[53,95] width:128 height:23 align:#left
	button 'createBtn' "create" pos:[59,214] width:107 height:27 align:#left
	button 'selectShapeBtn' "select" pos:[171,30] width:61 height:17 align:#left
	button 'selectObjBtn' "select" pos:[171,61] width:61 height:17 align:#left
	
	
	
	radiobuttons 'angleBtns' "angle:" pos:[17,137] width:79 height:62 labels:#("none", "positive", "negative") default:1 columns:1 align:#left
	
	on createBtn pressed do
	(
		local str = numInputBox.text
		local val = str as number
		local angleType = angleBtns.state
		print angleType
		if val == undefined or val<=0 then
			ShowMsg("please input create number")
		else
			OnCreateObj val angleType
		
	)
	on selectShapeBtn pressed do
		OnSelectShape()
	on selectObjBtn pressed do
		OnSelectObj()
)
createDialog CreateObjWin
)

三、注意的地方:

这个代码相对不是很复杂,下面说一下用到的几个知识点:

1、判断对象属于Shape

在拾取Shape对象的时候,如果拾取的对象不是Shape,将会对后面的步骤产生影响,所以在拾取对象的时候,用superclassof 获取一下当前选择的物体的父类,看是不是 S h a p e 。这里我也是偷懒了,因为用 获取一下当前选择的物体的父类,看是不是Shape。 这里我也是偷懒了,因为用 获取一下当前选择的物体的父类,看是不是Shape。这里我也是偷懒了,因为用读取当前选择的物体,如果同时选择的物体有多个的时候,会返回一个数组,包括下面的选择网格模型也一样。按道理要先判断是否数组然后再进行类型判断的。各位有兴趣可以自己补充一下。

2、获取Shape上的某一个点的坐标

lengthInterp [ <curve_num> ] [ steps: ]
通过这个方法,可以获取某条shape上面的某个比例[0.0-1.0]的一个点的位置,比如输入0.5,就可以获取线段中间一个点的坐标

3、获取Shape上的某一个点的切线方向

lengthTangent [ <curve_num> ] [steps: ]
通过这个方法可以获取线条上某个比例的点的切线方向

4、Shape的其他方法

可以看一下官网的API说明:

pathInterp [ <curve_num> ]
Return a point3 coordinate on the numbered curve (defaults to 1) corresponding to the
parameter value (0.0 to 1.0) that matches the 3ds Max Path controller percentage (vertex-based) interpolation.

lengthInterp [ <curve_num> ] [ steps: ]
Return a point3 coordinate on the numbered curve (defaults to 1)
corresponding to the parameter value (0.0 to 1.0) that is that
fraction along the curve’s total length.

resetLengthInterp ()
Clear length interpolation cache. Use this if
the curve you are length-interpolating along might have been edited
between calls.

curveLength [ <curve_num> ]
Return the arc length of the
numbered curve. This length does not reflect any transform level
scaling performed on the shape.

pathTangent [ <curve_num> ]
Return the tangent
direction vector at the 3ds Max Path (vertex-based) interpolated point
along the specified curve. You can use this function, for example, to
set an object’s direction to follow the curve.

lengthTangent [ <curve_num> ] [steps: ]
Return the tangent direction vector at the arc-length-interpolated
point along the specified curve. You can use this function to set an
object’s direction to follow the curve.

nearestPathParam [ <curve_num> ] [steps: ]
Return the interpolation parameter value (0.0 to 1.0) corresponding to
the point along the curve that is closest to the given
coordinate. The parameter is given as a 3ds MaxPath (vertex-based)
interpolation parameter value. You can then use pathInterp with this
value to find the nearest point’s coordinates, or use one of the
following functions for converting between arc-length parameters and
3ds Max Path percentage parameters.

pathToLengthParam [ <curve_num> ] [steps:]
Return the uniform arc-length length parameter corresponding to the
given 3ds Max Path (vertex-based) parameter for this curve.

lengthToPathParam [ <curve_num> ] [steps: ]
Return the 3ds Max Path (vertex-based) parameter corresponding to
the given uniform arc-length parameter for this curve.

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

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

相关文章

加盐加密——保障你的数据安全

目录 今日良言:理性和激情是生活不可或缺的调味品 一、加盐加密 1.普通密码的缺点 2.什么是加盐加密 3.加盐加密的过程 4.加盐加密的实现 今日良言:理性和激情是生活不可或缺的调味品 一、加盐加密 1.普通密码的缺点 在介绍加盐加密之前&#xff0c;先想想为什么普通密…

STM32F4_指针(单片机)

目录 前言 1. 计算机存储机制 2. 定义指针 2.1 指针操作 2.2 数组与指针 前言 指针(Pointer)是C语言的一个重要知识点&#xff0c;其使用灵活、功能强大&#xff0c;是C语言的灵魂。指针与底层硬件联系密切&#xff0c;使用指针可操作数据的地址&#xff0c;实现数据的间…

PreSumm模型

Text Summarization with Pretrained Encoders&#xff08;PreSumm模型&#xff09; 论文地址 摘要 在本文中&#xff0c;我们展示了如何在文本摘要中有效地应用BERT&#xff0c;并为提取性模型和抽象模型提出了一个通用框架。我们介绍了基于BERT的新颖文档级编码器&#xf…

安装VMware Workstation和虚拟机教程

一、VM简介   VMware Workstation中文版是一个“虚拟 PC”软件。它使你可以在一台机器上同时运行二个或更多 Windows、DOS、LINUX 系统。与“多启动”系统相比&#xff0c;VMWare 采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统&#xff0c;在系统切换时需要重…

iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】

文章目录 前言视频教程1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7…

sprintboot logback高级特性使用

一、业务需求 日志级别的分类 日志的级别分为&#xff1a; trace&#xff1a;微量&#xff0c;少许的意思&#xff0c;级别最低info&#xff1a;普通的打印信息debug&#xff1a;需要调试时候的关键信息打印warn&#xff1a;警告&#xff0c;不影响使⽤&#xff0c;但需要注…

Socket(四)

文章目录 1. 服务器Socket简介2. 使用ServerSocket3. 用Socket写入服务器4. 关闭服务器Socket 1. 服务器Socket简介 博客Socket&#xff08;一&#xff09;&#xff5e;Socket&#xff08;二&#xff09;从客户端的角度讨论了Socket&#xff0c;客户端就是向监听连接的服务器打…

Git基本概念

Git基础 git 介绍git工作流程 git 介绍 1、git是什么&#xff1a;是目前世界上最先进的分布式版本控制系统 2、git的优势 ● 适合分布式开发、强调个体。 ● 公共服务器压力和数量都不会太大 ● 速度快、灵活 ● 任意两个开发者之间可以很容易的解决冲突 ● 离线工作 3、git能…

华为OD机试真题B卷 Java 实现【乱序整数序列两数之和绝对值最小】,附详细解题思路

一、题目描述 给定一个随机的整数&#xff08;可能存在正整数和负整数&#xff09;数组 nums&#xff0c;请你在该数组中找出两个数&#xff0c;其和的绝对值(|nums[x]nums[y]|)为最小值&#xff0c;并返回这个两个数&#xff08;按从小到大返回&#xff09;以及绝对值。 每种…

全志V3S嵌入式驱动开发(网卡驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 一开始上来就说网卡&#xff0c;好像有点不太对劲。这主要是因为如果开发板可以连接网络的话&#xff0c;可以帮我们节约很多的时间&#xff0c;开…

逍遥自在学C语言 | 揭开while循环的神秘面纱

前言 循环是一种重要的控制结构&#xff0c;可以使程序重复执行一段代码&#xff0c;直到满足特定条件为止。 在C语言中&#xff0c;while和do-while是两种常用的循环结构&#xff0c;本文将详细介绍这两种循环的用法。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一…

eclipse安装lombok插件

项目中遇到了一些实体类声明了属性&#xff0c;缺少get/set方法&#xff0c;但是类上使用了Getter 和 Setter注解&#xff0c;查了下是lombok插件的强大功能。 这里先不看lombok的功能&#xff0c;先看下eclipse安装lombok插件的过程。 1、 https://projectlombok.org/downlo…

三十五、数学知识——快速幂(反复平方法 + 快速幂求逆元)

快速幂算法主要内容 一、基本原理1、概念 暴力求解2、核心原理——反复平方法3、快速幂求逆元 二、Java、C语言模板实现三、例题题解 一、基本原理 1、概念 暴力求解 问题目标&#xff1a; 快速求出 a^k mod p 的结果&#xff0c;时间复杂度为 O(logk)&#xff0c;其中 a,p…

华为OD机试真题B卷 Java 实现【字符串变换最小字符串】,附详细解题思路

一、题目描述 给定一个字符串s&#xff0c;最多只能进行一次变换&#xff0c;返回变换后能得到的最小字符串&#xff08;按照字典序进行比较&#xff09;。 变换规则&#xff1a;交换字符串中任意两个不同位置的字符。 二、输入描述 一串小写字母组成的字符串s。 三、输出…

人工智能-不确定性的量化

这一部分的重点内容有&#xff1a; 贝叶斯规则贝叶斯网络基于隐马尔可夫模型的概率推理 大概会有以下几种考察形式&#xff0c;有答案的历年期末考试题只解释一些注意的地方 贝叶斯网络-独立性 第二问答案很详细&#xff0c;第一问看↓ D-separation&#xff1a; 判断贝叶…

Stable-diffusion-webui 本地部署及使用

Stable-diffusion-webui 本地部署及使用 本地部署stable-diffusion-webui(windows)1.安装conda&#xff1b;2.创建conda env 和python 3.10.6&#xff1b;3.更新pip&#xff1b;4.安装cuda 11.8&#xff1b;5.克隆stable-diffusion-webui仓库 &#xff1b;6.下载SD模型7.运行sd…

Dubbo配置

dubbo配置官网参考 1.配置原则 JVM 启动 -D 参数优先&#xff0c;这样可以使用户在部署和启动时进行参数重写&#xff0c;比如在启动时需改变协议的端口。 XML 次之&#xff0c;如果在 XML 中有配置&#xff0c;则 dubbo.properties 中的相应配置项无效。 Properties 最后&a…

【群智能算法改进】一种改进的蝴蝶优化算法 改进蝴蝶优化算法 改进BOA[1]【Matlab代码#35】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始蝴蝶优化算法2. 改进蝴蝶优化算法2.1 动态转换概率策略2.2 最优邻域扰动策略2.3 随机惯性权重策略 3. 部分代码展示4. 仿真结果展示5. 资源获取6. 参考文献 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原…

React面试题和基础

React的特点&#xff1a; JSX它使用虚拟DOM &#xff0c;减少 DOM 操作&#xff0c;提升性能。便于和其他平台集成。它可以进行服务器端渲染。单向数据流。组件化 双向数据绑定和单向数据流区别&#xff1f; 单向绑定的优点在于清晰可控&#xff0c;缺点则在于模板代码过多。…

第一部分-基础篇-第二章:PSTN、PBX及呼叫中心业务

文章目录 序言上一篇文章&#xff1a;2.1 PSTN业务2.1.1 POTS2.1.2 商务业务2.1.3 其他增值业务 2.2 PBX业务2.2.1 呼叫转移2.2.2 同组代答 2.3 PBX与中继线2.4 IP-PBX业务2.5 呼叫中心2.5.1 什么是呼叫中心2.5.2 呼叫中心的历史2.5.3 呼叫中心的分类1.交换机类型的呼叫中心2.板…