首先被点击的物品 :
被点击的物品 有的是轴心 有的是 顶部 有的是底部。
如果是底部那么得到的物体y就是底部的需要把被点击物体y+当前物体材质的高度y加上才定位到顶点y,
然后要插入顶点 则直接y等于顶点就行。
/// <summary>
/// 插入一个指定长度的柱子 位于指定的y轴上方
/// </summary>
/// <param name="position"></param>
/// <param name="floatY"></param>
/// <param name="verticalMode">0 代表 底部 1 代表中心 1 代表 顶部</param>
/// <param name="color"></param>
internal static void DebugPrimitiveColorHeightInsertBar(Vector3 position, Vector3 size, float verticalMode, float selfHeight, Color color)
{
GameObject gameObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
gameObject.transform.localScale = new Vector3(0.1f, selfHeight, 0.1f);
gameObject.GetComponent<Renderer>().material.color = color;
float baseY;
if (verticalMode == 0)//轴心为底部 加上自身大小
{
baseY = position.y + size.y;
}
else if (verticalMode == 1)//轴心为中心 加上自身大小的一半
{
baseY = position.y + (size.y / 2f);//轴心Y
gameObject.transform.position = new Vector3(position.x, baseY +(selfHeight == 1 ? 0 : (selfHeight - 1) / 2f), position.z);
}
else
{
baseY = position.y;//轴心为顶部 则不需要加上自身大小
gameObject.transform.position = new Vector3(position.x, baseY + (selfHeight == 1 ? 0 : (selfHeight - 1) / 2f), position.z);
}
}
测试
DebugPrimitiveColorHeightInsertBar(clickedMaterialGameObject.transform.position, clickedMaterialSize, 1, 3, Color.red);
DebugPrimitiveColorHeightInsertBar(clickedMaterialGameObject.transform.position, clickedMaterialSize, 0, 30, Color.green);
输出结果
image.png
为了验证是否精确,于是我设置了一个超长缩放的条块
image.png
上面的红色平面 是和红色块是一起的,绿色平面在天上了
image.png
立方体的轴心是在立方体中心
但是测试的时候发现 还是基于y坐标加材质的高度才能计算出顶点,
但是测试其他不规则物体的时候轴心是底部,但是也是用了被点击物体y坐标+被点击物体的高度材质 + (1-(缩放后的高度)/2)
关于计算任何轴心的方式我陷入了沉思
image.png
上图的黑色 平面是用于输出y坐标轴心 忽略原始轴心的,但是网上这个方法似乎并不好使。
Vector3 vector3 = CalcModelCenter(clickedMaterialGameObject.transform);
DebugPrimitiveColorHeight(clickedMaterialGameObject.transform.position, vector3.y, Color.black);
internal static void DebugPrimitiveColorHeight(Vector3 position, float floatY, Color color)
{
GameObject gameObject = GameObject.CreatePrimitive(PrimitiveType.Plane);
gameObject.transform.localScale = new Vector3(0.4f, 1, 0.4f);
gameObject.GetComponent<Renderer>().material.color = color;
gameObject.transform.position = new Vector3(position.x, floatY, position.z);
}
/// <summary>
/// 计算模型的中心点
/// </summary>
/// <param name="tran"></param>
/// <returns></returns>
public static Vector3 CalcModelCenter(Transform tran)
{
Vector3 position = tran.position;
Quaternion quaternion = tran.rotation;
Vector3 scale = tran.localScale;
tran.position = Vector3.zero;
tran.rotation = Quaternion.Euler(Vector3.zero);
tran.localScale = Vector3.one;
Vector3 center = Vector3.zero;
Renderer[] renders = tran.GetComponentsInChildren<Renderer>();
foreach (Renderer child in renders)
{
center += child.bounds.center;
}
center /= tran.GetComponentsInChildren<Renderer>().Length;
Bounds bounds = new Bounds(center, Vector3.zero);
foreach (Renderer item in renders)
{
bounds.Encapsulate(item.bounds);
}
tran.position = position;
tran.rotation = quaternion;
tran.localScale = scale;
foreach (Transform item in tran)
{
item.position = item.position - bounds.center;
}
return bounds.center + tran.position;
}
所以到底有没有忽略轴心真正得出顶点低点的正确代码呢。关于插入顶点的问题
在rect cavans world 有点问题了
x
xxx
xx
所以各位大佬 到底怎么解决这个问题。