Unity3D 截取6面图 做全景图脚本
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class PanoramaGenerator : ScriptableWizard
{
[Header("360 全景相机")]
public Camera panoramaCamera;
string[] skyBoxImage = new string[] { "_back", "_right", "_front", "_left", "_up", "_bottom"};
Vector3[] skyDirection = new Vector3[] {new Vector3(0, 0, 0), new Vector3(0, -90, 0), new Vector3(0, 180, 0), new Vector3(0, 90, 0), new Vector3(-90, 180, 0), new Vector3(90, 180, 0)};
[Header("截取图片尺寸,最好为 2的N次方")]
public int ScreenSize = 1024;
[Header("SkyBox")]
public Cubemap cubemap;
void OnWizardUpdate()
{
helpString = "Select transform to render from";
isValid = (panoramaCamera != null);
}
void OnWizardCreate()
{
panoramaCamera.backgroundColor = Color.black;
panoramaCamera.clearFlags = CameraClearFlags.Skybox;
panoramaCamera.fieldOfView = 90;
panoramaCamera.aspect = 1.0f;
panoramaCamera.transform.rotation = Quaternion.identity;
for (var orientation = 0; orientation < skyDirection.Length; orientation++)
{
renderSkyImage(orientation, panoramaCamera.gameObject);
}
if (cubemap)
{
panoramaCamera.RenderToCubemap(cubemap);
}
}
[MenuItem("360 全景/ 渲染6张图", false, 4)]
static void RenderSkyBox()
{
ScriptableWizard.DisplayWizard<PanoramaGenerator>("Render SkyBox","渲染!");
}
void renderSkyImage(int orientation, GameObject go)
{
try
{
go.transform.eulerAngles = skyDirection[orientation];
var screenSize = ScreenSize;
RenderTexture rt = new RenderTexture(screenSize, screenSize, 24);
go.GetComponent<Camera>().targetTexture = rt;
var screenShot = new Texture2D(screenSize, screenSize, TextureFormat.RGBA32, false);
go.GetComponent<Camera>().Render();
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, screenSize, screenSize), 0, 0);
RenderTexture.active = null;
var bytes = screenShot.EncodeToPNG();
var directory = "Assets/Skyboxes";
if (!System.IO.Directory.Exists(directory))
System.IO.Directory.CreateDirectory(directory);
System.IO.File.WriteAllBytes(System.IO.Path.Combine(directory, skyBoxImage[orientation] + ".png"), bytes);
DestroyImmediate(rt);
}
catch(System.Exception ex)
{
}
}
}
----------------------------------------------------------------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class PanoramaGenerator : ScriptableWizard
{
[Header("720 全景相机")]
public Camera[] panoramaCamera;
[SerializeField, Header("是否启用父级名称")]
bool isUsingParentName=false;
string[] skyBoxImage = new string[] { "_back", "_right", "_front", "_left", "_up", "_bottom"};
Vector3[] skyDirection = new Vector3[] {new Vector3(0, 0, 0), new Vector3(0, -90, 0), new Vector3(0, 180, 0), new Vector3(0, 90, 0), new Vector3(-90, 180, 0), new Vector3(90,180, 0)};
[Header("截取图片尺寸,最好为 2的N次方")]
public int ScreenSize = 1024;
[Header("图片缩放因子"),Range(1,6)]
public int factor = 1;
[Header("SkyBox")]
public Cubemap cubemap;
void OnWizardUpdate()
{
helpString = "Select transform to render from";
isValid = (panoramaCamera != null);
}
void OnWizardCreate()
{
if (panoramaCamera.Length > 0)
{
foreach (var camera in panoramaCamera)
{
Create(camera);
}
}
}
void Create(Camera panoramaCamera)
{
panoramaCamera.backgroundColor = Color.blue;
panoramaCamera.clearFlags = CameraClearFlags.Skybox;
panoramaCamera.fieldOfView = 90;
panoramaCamera.aspect = 1.0f;
panoramaCamera.transform.rotation = Quaternion.identity;
for (var orientation = 0; orientation < skyDirection.Length; orientation++)
{
renderSkyImage(orientation, panoramaCamera.gameObject);
}
if (cubemap)
{
panoramaCamera.RenderToCubemap(cubemap);
}
}
[MenuItem("720 全景/ 渲染6张图", false, 4)]
static void RenderSkyBox()
{
ScriptableWizard.DisplayWizard<PanoramaGenerator>("Render SkyBox","渲染!");
}
void renderSkyImage(int orientation, GameObject go)
{
try
{
go.transform.eulerAngles = skyDirection[orientation];
var screenSize = ScreenSize* factor;
RenderTexture rt = new RenderTexture(screenSize, screenSize, 24);
go.GetComponent<Camera>().targetTexture = rt;
var screenShot = new Texture2D(screenSize, screenSize, TextureFormat.RGB24, false);
go.GetComponent<Camera>().Render();
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, screenSize, screenSize), 0, 0);
RenderTexture.active = null;
var bytes = screenShot.EncodeToJPG();
var directory = "Assets/Skyboxes/";
if (isUsingParentName)
{
if (go.transform.parent)
{
directory += go.transform.parent.name;
}
else
{
directory += go.name;
}
}
else
{
directory += go.name;
}
if (!System.IO.Directory.Exists(directory))
System.IO.Directory.CreateDirectory(directory);
System.IO.File.WriteAllBytes(System.IO.Path.Combine(directory, skyBoxImage[orientation] + ".jpg"), bytes);
go.GetComponent<Camera>().targetTexture = null;
DestroyImmediate(rt);
}
catch(System.Exception ex)
{
Debug.LogError(ex.Message);
}
}
}
Unity3D 截取6面图 做全景图脚本相关推荐
- 【Python】如何用pyth做游戏脚本(太简单了吧)
文章目录 前言 一.开发前景 二.开发流程 3.1.获取窗口句柄,把窗口置顶 3. 2.截取游戏界面,分割图标,图片比较 二.程序核心-图标连接算法(路径寻找) 四.开发总结 五.源码 总结 前言 简 ...
- flutter 切图重命名脚本
把2倍图,3倍图进行冲命名 import os, shutilwork_dir = '/Users/baohong/Downloads/未命名文件夹3/slices' shutil.rmtree(wo ...
- 关于主机的思维导图_读《思维导图》系列丛书----我用思维导图做什么?
多图预警! 作者简介:深圳一所公立高中的生物老师,日常是备备课,读读书,打打球,吹吹牛. 我将从以下几个方面介绍我是如何使用思维导图的. 图1:介绍我如何使用思维导图的思维导图 1.我平时用思维导图来 ...
- python画气泡图_用Python把图做的好看点:用Matplotlib画个好看的气泡图
我们继续来把简单的图形丢到极坐标,这次是气泡图和柱状图,临摹的对象是澎湃美数课 这个图看起来很好看,原理其实很简单,把柱状图和气泡图从笛卡尔坐标系中转移到极坐标系中来就OK 我们开始本次的临摹吧 本期 ...
- 项目进度计划甘特图_甘特图做项目进度计划的技巧?
原标题:甘特图做项目进度计划的技巧? 甘特图怎么做项目进度计划?首先我们先了解一下,什么是甘特图. 甘特图(Gantt chart)又称为横道图.条状图(Bar chart),是由提出者亨利·L·甘特 ...
- 如何使用思维导图做计划?这样绘制思维导图的方法你使用过吗?
用思维导图做计划确实是比较快捷高效的,不仅带来了帮助,还给大家的工作,生活,学习等带来了很多乐趣,下面结合小编应用思维导图的经历给大家讲解绘制思维导图做计划的操作技巧,希望对大家有所帮助. 绘制工具- ...
- 如何使用思维导图做计划的6种模板类型
有句话说"闲时无计划,忙时多费力",好的计划让你的思维清晰,能创造出事半功倍的效果,由此可见做计划对我们的重要性,而利用思维导图我们可以快速地做各种事情的规划,接下来我分享一些用思 ...
- 介绍一个产品的思维导图_产品经理可以用思维导图做什么?
每一位产品经理,手上会的软件工具想必都是非常多的.思维导图软件应该也是产品经理都十分依赖的工具.思维导图可以帮助产品经理梳理多而乱的产品思路,也可以帮助产品经理进行需求管理.产品分析等.本文就来聊一聊 ...
- 怎么用思维导图做会议纪要?MindNow来教你
怎么用思维导图做会议纪要?会议纪要是一种记载和传达会议基本情况和主要精神.议定事项等内容的规定性公文,具有内容的纪实性.表达的要点性.称谓的特殊性等基本特点,怎么制作一份不错的会议纪要呢?思维导图就是 ...
最新文章
- dr优先级默认_当配置一个CISCO的路由器时,缺省的DR和BDR优先级是()。
- 64位的机器上VS2008不能使用SharePoint的workflow template
- 模态框到阻止冒泡时间
- AVP 6目GoPro全景拼接
- Using libcurl in VC++
- Servlet 组件相关的接口、抽象类关系图
- SQL SERVER 参考:游标(Cursor)的讲解与实例
- Posted content length of 26789546 exceeds limit of 10485760
- Autolayout代码实现举例-02-使用VFL
- html css 博客园,分享几个博客园代码样式的CSS配置(复制黏贴即可)
- gg修改器偏移量修改_GG修改器偏移是怎么弄 | 手游网游页游攻略大全
- 一.mtk平台的gpio控制
- 电脑桌面打开计算机打开多个,如何在电脑桌面并排显示多个Excel工作表
- Docker深入浅出系列
- 题目1035:找出直系亲属 树
- 【Codewars】Bouncing Balls
- win10修改hosts小工具
- 图鉴|春节怼亲戚指南(2020版)
- 2021-04-28 Mac上插入公式的三种方法
- cmake-gui使用教程
热门文章
- 不同粒径大小的金纳米粒子|单分散小粒径金纳米颗粒|黄色纳米颗金粒粒径2nm
- 低功耗蓝牙通讯 C# WinForm
- python带你制作一个gequ下载器,海量gequ免费听
- linux 驱动程序 摇杆 游戏,SDL游戏摇杆(Joy Stick)开发
- C#中Winfrom默认输入法的设置方法
- 开发Windows Mobile今日插件 -- 内存电量,桌面便笺,桌面记单词(转自hoodlum1980 ( 發發 ) 的技术博客)
- 什么是Service
- 詹姆斯·克拉克·麦克斯韦: 麦克斯韦方程的历史
- 华为鸿蒙系统摄像头什么时候预售开卖,华为智选海雀智能摄像头PRO开卖 采用鸿蒙OS 内置AI智慧侦测...
- 故障:卡死原因及解决