定序器导出fbx到max里对位k动作

news2025/1/16 15:59:18

可以把场景移动到原点去k动作,然后可以恢复到ue4的位置

-- 定义全局变量
global CenterPoint = undefined
global averageCenter = [0,0,0]

-- 定义对话框
rollout restoreRollout "定序器>FBX>MAX" 
(
	button CreateButton "建立中心点" width:150 height:30
	button saveIntButton "保存初始变换>txt" width:150 height:30 enabled:false
    button ResetButton "复位到原点" width:150 height:30 enabled:false
	button saveOriginButton "保存原点变换>txt" width:150 height:30 enabled:false
    button LoadIntButton "txt>恢复初始变换" width:150 height:30 enabled:false
	button LoadOriginButton "txt>恢复原点变换" width:150 height:30 enabled:false
	radiobuttons targetAxis width:97 height:16 labels:#("零转动","转到-Y轴") default:1 columns:2  enabled:false

	
	fn CreateCenterPoint =
	(
		-- 获取用户选择的所有物体
		selectedObjects = getCurrentSelection()
		
		--初始化averageCenter不能少,否则for循环体里就有两次位置叠加
		averageCenter = [0,0,0]
		
		-- 计算选择的物体的平均中心点
		for obj in selectedObjects do
		(
			averageCenter += obj.position
		)
		averageCenter /= selectedObjects.count --计算平均点

		-- 创建一个帮助器对象作为平均中心点
		CenterPoint = point pos:averageCenter
		CenterPoint.size = 10000
		CenterPoint.name="CenterPoint"
		-- 将选择的物体作为平均中心点的子物体
		for obj in selectedObjects do
		(
			obj.parent = $CenterPoint
		)
	)
	fn SaveIntTransformData obj =
	(
		-- 获取当前Max文件的路径
		MaxPath = maxFilePath
		MaxName = trimright maxfilename ".max"
		-- 获取CenterPoint的transform数据
		CenterPointPositiion = obj.transform.position
		CenterPointRotation=quatToEuler (obj.transform.rotation as quat)
		CenterPointScale=obj.transform.scale
		
		-- 初始化textToWrite变量
		textToWrite = ""
		
		-- 构建要写入的文本内容
		textToWrite += "Position:" + CenterPointPositiion as string + "\n"
		textToWrite += "Rotation(Euler):" + CenterPointRotation as string + "\n"
		textToWrite += "Scale:" + CenterPointScale as string

		-- 构建完整的文件路径
		outputFilePath = maxPath +MaxName+ "_Int.txt"

		-- 创建文本文件并写入内容
			-- 检查文件是否存在
			if doesFileExist outputFilePath then (
				-- 如果文件存在,则以追加模式打开文件
				outputFile = openFile outputFilePath mode:"w"
				-- 写入内容到文件
				format "%" textToWrite to:outputFile
			) else(
				-- 如果文件不存在,则创建新文件
				outputFile = createFile outputFilePath
				-- 写入内容到文件
				format "%" textToWrite to:outputFile
			)		
		-- 关闭文件
		close outputFile
	)
	fn ResetTransformData = 
	(
		if isValidNode($CenterPoint) then
		(
			-- 将平均中心点移动到坐标原点
			$CenterPoint.position = [0,0,0]
			
			-- 让平均中心点的 x 轴对齐到世界坐标的 y 轴
			if (targetAxis.state ==1) do(
			$CenterPoint.rotation = eulerangles 0 0 0 --保持默认朝向平移中心点
			)
			if (targetAxis.state ==2) do(
			$CenterPoint.rotation = eulerangles 0 0 -90  --把中心点的x轴对齐向世界坐标的负y轴
			)
		)
		else
		(
			messagebox "Error: CenterPoint 物体不存在."
			destroyDialog restoreRollout
		)
	)
	fn SaveOriginTransformData obj =
	(
		-- 获取当前Max文件的路径
		MaxPath = maxFilePath
		MaxName = trimright maxfilename ".max"
		-- 获取CenterPoint的transform数据
		CenterPointPositiion = obj.transform.position
		CenterPointRotation=quatToEuler (obj.transform.rotation as quat)
		CenterPointScale=obj.transform.scale
		
		-- 初始化textToWrite变量
		textToWrite = ""
		
		-- 构建要写入的文本内容
		textToWrite += "Position:" + CenterPointPositiion as string + "\n"
		textToWrite += "Rotation(Euler):" + CenterPointRotation as string + "\n"
		textToWrite += "Scale:" + CenterPointScale as string

		-- 构建完整的文件路径
		outputFilePath = maxPath +MaxName+ "_Origin.txt"

		-- 创建文本文件并写入内容
			-- 检查文件是否存在
			if doesFileExist outputFilePath then (
				-- 如果文件存在,则以追加模式打开文件
				outputFile = openFile outputFilePath mode:"w"
				-- 写入内容到文件
				format "%" textToWrite to:outputFile
			) else(
				-- 如果文件不存在,则创建新文件
				outputFile = createFile outputFilePath
				-- 写入内容到文件
				format "%" textToWrite to:outputFile
			)
		
		-- 关闭文件
		close outputFile
	)
	fn LoadIntTransformData obj = 
	(
		-- 获取当前Max文件的路径
		maxPath = maxFilePath
		MaxName = trimright maxfilename ".max"
		-- 构建txt文件路径
		txtFilePath = maxPath + MaxName+"_Int.txt"

		-- 检查文件是否存在
		if doesFileExist txtFilePath then
		(
			-- 读取txt文件内容
			txtFile = openFile txtFilePath mode:"r"
			while not eof txtFile do
			(
				--先把被旋转的欧拉角归零这样下面的位移等数据才能正确读取
				$CenterPoint.rotation=(eulerAngles 0 0 0)
				-- 逐行读取文本文件内容
				line = readline txtFile
				-- 提取位置、旋转和缩放数据
				if matchPattern line pattern:"Position:*" then
				(
					positionStr = substituteString line "Position:" ""
					position = execute positionStr
					obj.position = position
				)
				else if matchPattern line pattern:"Rotation(Euler):*" then
				(
					rotationStr = substituteString line "Rotation(Euler):" ""
					rotation = execute rotationStr
					obj.rotation = rotation as quat -- 将欧拉角转换为四元数
				)
				else if matchPattern line pattern:"Scale:*" then
				(
					scaleStr = substituteString line "Scale:" ""
					scale = execute scaleStr
					obj.scale = scale
				)
			)
			close txtFile
		)
		else
		(
			print "文本文件不存在!"
		)
	)
	fn LoadOriginTransformData obj = 
	(
		-- 获取当前Max文件的路径
		maxPath = maxFilePath
		MaxName = trimright maxfilename ".max"
		-- 构建txt文件路径
		txtFilePath = maxPath + MaxName+"_Origin.txt"

		-- 检查文件是否存在
		if doesFileExist txtFilePath then
		(
			-- 读取txt文件内容
			txtFile = openFile txtFilePath mode:"r"
			while not eof txtFile do
			(
				--先把被旋转的欧拉角归零这样下面的位移等数据才能正确读取
				$CenterPoint.rotation=(eulerAngles 0 0 0)
				-- 逐行读取文本文件内容
				line = readline txtFile
				-- 提取位置、旋转和缩放数据
				if matchPattern line pattern:"Position:*" then
				(
					positionStr = substituteString line "Position:" ""
					position = execute positionStr
					obj.position = position
				)
				else if matchPattern line pattern:"Rotation(Euler):*" then
				(
					rotationStr = substituteString line "Rotation(Euler):" ""
					rotation = execute rotationStr
					obj.rotation = rotation as quat -- 将欧拉角转换为四元数
				)
				else if matchPattern line pattern:"Scale:*" then
				(
					scaleStr = substituteString line "Scale:" ""
					scale = execute scaleStr
					obj.scale = scale
				)
			)
			close txtFile
		)
		else
		(
			print "文本文件不存在!"
		)
	)
on CreateButton pressed do (	
	CreateCenterPoint()
	saveIntButton.enabled = true
	CreateButton.enabled = false
	)
on saveIntButton pressed do (
	SaveIntTransformData $CenterPoint
	ResetButton.enabled = true
	targetAxis.enabled = true
	saveIntButton.enabled = false
	)
on ResetButton pressed do (
	ResetTransformData()
	saveOriginButton.enabled = true
	ResetButton.enabled = false
	)
on saveOriginButton pressed do (
	SaveOriginTransformData $CenterPoint
	LoadIntButton.enabled = true
	)
on LoadIntButton pressed do (
	LoadIntTransformData $CenterPoint
	LoadOriginButton.enabled = true
	ResetButton.enabled = true
	)
on LoadOriginButton pressed do( 
	LoadOriginTransformData $CenterPoint
	CreateButton.enabled = false
	ResetButton.enabled = true
	)
)
-- 创建对话框
createDialog restoreRollout

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

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

相关文章

使用JS代理 实现大对象的功能拆解

序言 在Android开发中,可以通过webView的addJavascriptInterface方法注入一个对象到网页中。但是随着开发的需求越来越多。这个对象身上的方法也越来越多。这个对象对应的java类,体积越来越大,不利于维护。为了在不影响之前代码的基础上。把…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 操作系统有4个安全目标,也就是说想要保证操作系统的安全,就必须实现这4个需求: 标识系统…

网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层,每层的作用,知道数据在七层模型中是怎样传输的,封包和解…

数据结构练习:链表扩容

大致步骤: 一:创建一个新链表,遍历原链表的同时,将原链表的值复制给新链表 二:将新链表插入到原链表中(大致如下) 注: 1.头结点是不存有数据的 2.记得malloc后要free 3.*&是…

男士休闲裤比较好的品牌有哪些?高品质休闲男装推荐

穿衣服最重要的并不是要求多好看多时尚,相信绝大部分年纪在23岁以上的男同胞们更希望穿一些简约好搭配的款式,更重要的其实就是要求质量耐穿,以及有足够好的舒适性。 但是现在市面上的品牌实在是太多了,而且质量也参差不齐&#x…

SpringBoot 3.x + Swagger3 踩坑实录

问题描述 维护的SpringBoot版本是3.0版本,翻教程的时候发现很多SpringBoot2.x版本用的都是springfox,但问题是在SpringBoot3.x版本后,逐渐不支持springfox,强行启动会导致异常,现阶段使用的Springdoc进行替换。 参考…

设计模式-六大原则

设计模式的六大原则是软件工程中的基本概念,使得构建可维护、可扩展和可重用的代码。 1.单一职责原则(Single Responsibility Principle):一个类或方法应该只有一个引起变化的原因,确保类或模块的功能高度内聚。 案例&…

力扣数据库题库学习(4.22日)

577. 员工奖金 问题链接 思路分析 Employee表与Bonus表通过empId字段可以连接,需求是查出奖金少于1000的员工名和奖金值。 这里奖金少于1000的情况就是没有奖金有奖金但少于1000 这里我给出的解决方案就是使用左连接,将Employee表作为左表&#xff…

c++二叉树的进阶--二叉搜索树

1. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左…

企业为什么要选择通配符SSL证书使用?

企业选择使用通配符SSL证书主要是出于以下几个重要原因: 1. 经济性: - 节省成本:相较于为每一个子域名单独购买并维护单独的SSL证书,通配符证书能够以一张证书覆盖同一主域名下的所有同级子域名,无需为新增或已有的子域…

SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

1.MybatisPlus常用注解: 1.1 当数据库、表名和字段名和实体类完全一致时无需加注解,不一致时: TableName指定库名 TableId指定表名 TableField指定字段名 1.2 自增主键: TableId(typeIdType.AUTO) private Long id; 1.3 实体类中属…

【JAVA】java 中的Stream 常用函数

java 中的Stream 常用函数 一、简介1.1、什么是Stream?1.2、创建Stream1.3、Stream的特性 二、Stream的操作2.1、中间操作:2.2、终端操作:2.3、Stream的并行处理 三、Stream 常用函数四、使用示例4.1、计算集合中偶数的平方和:4.2…

新手也能学会的甘特图制作教程

甘特图是什么? 甘特图(Gantt Chart)是一种以图表形式直观展示项目计划的工具,由20世纪初的管理学家亨利甘特(Henry Gantt)发明并命名。它具有以下几个主要特点: 水平时间轴 甘特图的横轴是一条时间轴,通常按天、周或月来刻度,直观展示了项目从开始到结束的整个时间…

【信息收集】端口扫描masscan负载均衡识别lbd

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、什么是masscan masscan在kali系统上是自带的端口扫描…

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测; 2.输入7个特征&#xf…

考研日常记录(upd 24.4.24)

由于实在太无聊了 , 所以记录以下考研备考日常 , 增加一点成就感 , 获得一点前进动力。 文章目录 2024.4.18 周四课程情况:时间规划: 2024.4.19 周五课程情况:时间规划: 2024.4.20 周六2024.4.2…

Java知识总结---并发篇

线程 线程的状态 Java中线程可以有如下6中状态: NEW 新创建 RUNNABLE 可运行 BLOCKED 阻塞 WAITING 等待 TIMED WAITING 计时等待 TERMINATED 终止 线程的创建 (1)继承Thread类 public class ExtendsThread extends Thread { O…

学习Docker笔记

在23号刚刚学完新版本的docker还想说回去继续学习老版本的springcloud课程里面的docker 结果一看黑马首页新版本课程出了,绷不住了。以下是我学习新版本docker的笔记,记录了我学习过程遇到的各种bug和解决,也参考了黑马老师的笔记&#xff1a…

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略 导读:2024年4月23日,微软发布Phi-3,这是微软推出的一款新的开源AI模型家族Phi-3。背景痛点:小语言模型(SLM)尽管规模不大,但在语言理解、代码…

three.js 制作卡牌正反面 旋转

1.效果图 2.代码 <template><div><div id"container"></div></div> </template><script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.…