当前位置:网站首页>Unity中实现点选RenderTexture中的3D模型
Unity中实现点选RenderTexture中的3D模型
2022-07-31 15:11:00 【幽满谷】
来自: https://blog.csdn.net/zhaojunkuan/article/details/113344129
重写RawImage,两种情况,一种是UI有专门的UI相机,一种是没有专门的UI相机
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Lylibs
{
public class LyRawImage : RawImage, IPointerClickHandler
{
// 点击RawImage时,相对RawImage自身的坐标
private Vector2 ClickPosInRawImg;
// 预览映射相机
private Camera PreviewCamera;
private Camera UICamera;
private Canvas canvasa;
protected override void Start()
{
// 初始获取预览映射相机
if (PreviewCamera == null)
{
PreviewCamera = GameObject.Find("PreviewCamera").transform.GetComponent<Camera>();
}
if (UICamera == null)
{
UICamera = GameObject.Find("UICamera").transform.GetComponent<Camera>();
}
if (canvasa == null)
{
canvasa = GameObject.Find("Canvas").transform.GetComponent<Canvas>();
}
}
void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
{
//GetRawImageObj(eventData, rectTransform, PreviewCamera);
CheckDrawRayLine(canvasa, eventData.position, this, PreviewCamera, UICamera);
}
#region UI不绑定相机
/// <summary>
/// 通过点击RawImage中映射的RenderTexture画面,对应的相机发射射线,得到物体
/// </summary>
/// <param name="data">rawimage点击的数据</param>
/// <param name="rawImgRectTransform">rawimage的recttransfotm</param>
/// <param name="previewCamera">生成rendertexture中画面的相机</param>
/// <returns>返回射线碰撞到的物体</returns>
private GameObject GetRawImageObj(PointerEventData data, RectTransform rawImgRectTransform, Camera previewCamera)
{
GameObject obj = null;
var pos = (data.position - (Vector2)rawImgRectTransform.position) / rawImgRectTransform.lossyScale - rawImgRectTransform.rect.position;
var rate = pos / rawImgRectTransform.rect.size;
var ray = previewCamera.ViewportPointToRay(rate);
RaycastHit raycastHit;
if (Physics.Raycast(ray, out raycastHit))
{
Debug.Log(raycastHit.transform.name);
obj = raycastHit.transform.gameObject;
}
return obj;
}
#endregion
#region UI有专门的UI相机
/// <summary>
/// 射线投射
/// </summary>
/// <param name="canvas">画布</param>
/// <param name="mousePosition">当前Canvas下点击的鼠标位置</param>
/// <param name="previewImage">预览图</param>
/// <param name="previewCamera">预览映射图的摄像机</param>
private void CheckDrawRayLine(Canvas canvas, Vector3 mousePosition, RawImage previewImage, Camera previewCamera, Camera UiCamera)
{
Vector2 ClickPosInRawImg;
// 将UI相机下点击的UI坐标转为相对RawImage的坐标
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, mousePosition, UiCamera, out ClickPosInRawImg))
{
//获取预览图的长宽
float imageWidth = previewImage.rectTransform.rect.width;
float imageHeight = previewImage.rectTransform.rect.height;
//获取预览图的坐标,此处RawImage的Pivot需为(0,0),不然自己再换算下
float localPositionX = previewImage.rectTransform.localPosition.x;
float localPositionY = previewImage.rectTransform.localPosition.y;
//获取在预览映射相机viewport内的坐标(坐标比例)
float p_x = (ClickPosInRawImg.x - localPositionX) / imageWidth;
float p_y = (ClickPosInRawImg.y - localPositionY) / imageHeight;
//从视口坐标发射线
Ray p_ray = previewCamera.ViewportPointToRay(new Vector2(p_x, p_y));
RaycastHit p_hitInfo;
if (Physics.Raycast(p_ray, out p_hitInfo))
{
//显示射线,只有在scene视图中才能看到
Debug.DrawLine(p_ray.origin, p_hitInfo.point);
// Debug.Log(p_hitInfo.transform.name);
}
}
}
#endregion
}
}
边栏推荐
- 力扣:714. 买卖股票的最佳时机含手续费
- Trigonometric identity transformation formula
- RecyclerView高效使用第三节
- NPM Taobao mirror (latest version) released a new version of npm mirror at 2021-11-21 16:53:52 [easy to understand]
- 架构实战营模块8消息队列表结构设计
- Selenium自动化中无头浏览器的应用
- charles进行弱网测试(app弱网测试怎么做)
- How to clean up the lodash.memoize cache in the element-plus virtual table virtual-list component?
- Groupid(artifact id)
- AVH部署实践 (一) | 在Arm虚拟硬件上部署飞桨模型
猜你喜欢

自适应控制——仿真实验三 用超稳定性理论设计模型参考自适应系统

分成两栏后文字顺序混乱的问题解决【写期刊论文时】

【CUDA学习笔记】初识CUDA

网银被盗?这篇文章告诉你如何安全使用网银

「秋招系列」MySQL面试核心25问(附答案)

NC | 斯坦福申小涛等开发数据可重复分析计算框架TidyMass
![Recommendation System - Recall Phase - 2013: DSSM (Twin Towers Model) [Embedding (Semantic Vector) Recall] [Microsoft]](/img/40/b567780ed2cf04f1f1336922816f86.png)
Recommendation System - Recall Phase - 2013: DSSM (Twin Towers Model) [Embedding (Semantic Vector) Recall] [Microsoft]

看交互设计如何集成到Scrum敏捷流程中

使用 PyTorch 检测眼部疾病

Female service community product design
随机推荐
763.划分字母区间——之打开新世界
Efficient use of RecyclerView Section 3
TRACE32 - C source code association
ES6 类
SIGABRT 报错时的注意事项和解决方法
深入浅出边缘云 | 4. 生命周期管理
格林美瑞交所IPO:募资3.8亿美元 更多中国企业将赴欧洲上市
R语言ggstatsplot包ggbarstats函数可视化条形图、并添加假设检验结果(包含样本数、统计量、效应大小及其置信区间、显著性、组间两两比较、贝叶斯假设)、检验结果报告符合APA标准
安装Xshell并使用其进行Ymodem协议的串口传输
json到底是什么(c# json)
TRACE32——常用操作
DeepLab Series Learning
工程流体力学复习
消息队列消息数据存储MySQL表设计
Small test knife: Go reflection helped me convert Excel to Struct
R language ggplot2 visualization: use the ggboxplot function of the ggpubr package to visualize the grouped box plot, use the ggpar function to change the graphical parameters (caption, add, modify th
Getting started with UnityShader (3) - Unity's Shader
element-plus虚拟表格virtual-list组件中是怎么实现清理lodash.memoize缓存的?
Public Key Retrieval is not allowed error solution when DBeaver connects to MySQL 8.x
如何进行需求分析评审