当前位置:网站首页>Implementing click on the 3D model in RenderTexture in Unity
Implementing click on the 3D model in RenderTexture in Unity
2022-07-31 15:22:00 【overgrown valley】
来自: 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
}
}
边栏推荐
- 使用 Chainlink Keepers 实现智能合约函数的自动化执行
- SIGABRT 报错时的注意事项和解决方法
- 贪吃蛇项目(简单)
- 学习笔记12--路径-速度分解法之局部路径搜索
- Kubernetes原理剖析与实战应用手册,太全了
- 名创优品斥资6.95亿购买创始人叶国富所持办公楼股权
- Bilateral filtering acceleration "recommended collection"
- Getting Started with TextBlock Control Basic Tools Usage, Get Started
- 使用 GraphiQL 可视化 GraphQL 架构
- 腾讯云部署----DevOps
猜你喜欢

基于最小二乘法和SVM从天气预报中预测太阳能发电量(Matlab代码实现)
![[CUDA study notes] First acquaintance with CUDA](/img/a2/f322ebe9dc483028f68882ee2c866b.png)
[CUDA study notes] First acquaintance with CUDA

Synchronized and volatile interview brief summary

Kubernetes常用命令

Public Key Retrieval is not allowed error solution when DBeaver connects to MySQL 8.x

名创优品斥资6.95亿购买创始人叶国富所持办公楼股权

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

WPF项目--控件入门基础用法,必知必会XAML

TRACE32——基于SNOOPer的变量记录

STM32(十)------- SPI通信
随机推荐
STM32(十)------- SPI通信
TRACE32 - SNOOPer-based variable logging
R语言向前或者向后移动时间序列数据(自定义滞后或者超前的期数):使用dplyr包中的lag函数将时间序列数据向前移动一天(设置参数n为正值)
vb中如何连接mysql_vb怎么连接数据库「建议收藏」
R语言ggstatsplot包ggbarstats函数可视化条形图、并添加假设检验结果(包含样本数、统计量、效应大小及其置信区间、显著性、组间两两比较、贝叶斯假设)、检验结果报告符合APA标准
TRACE32 - C source code association
力扣:56. 合并区间
R language moves time series data forward or backward (custom lag or lead period): use the lag function in the dplyr package to move the time series data forward by one day (set the parameter n to a p
Ubantu project 4: xshell, XFTP connected the virtual machine and set xshell copy and paste the shortcut
abaqus find contact pairs报错:surface name is already in use
Matlab矩阵基本操作(定义,运算)
button控件的使用
Codeforces Round #796 (Div. 2)(A-D)
OPPO在FaaS领域的探索与思考
LeetCode二叉树系列——226.翻转二叉树
使用 GraphiQL 可视化 GraphQL 架构
Synchronized和volatile 面试简单汇总
Matlab matrix basic operations (definition, operation)
RecyclerView高效使用第三节
TCP详解