您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

58 行
1.5 KiB

using System;
using UnityEngine;
namespace Unity.DemoTeam.DigitalHuman
{
[Serializable]
public struct Barycentric
{
public float u;
public float v;
public float w;
public Barycentric(ref Vector3 q, ref Vector3 a, ref Vector3 b, ref Vector3 c)
{
// compute (u, v, w) for point q in plane spanned by triangle (a, b, c)
// https://gamedev.stackexchange.com/a/23745
//Vector3 v0 = b - a;
float x0 = b.x - a.x;
float y0 = b.y - a.y;
float z0 = b.z - a.z;
//Vector3 v1 = c - a;
float x1 = c.x - a.x;
float y1 = c.y - a.y;
float z1 = c.z - a.z;
//Vector3 v2 = q - a;
float x2 = q.x - a.x;
float y2 = q.y - a.y;
float z2 = q.z - a.z;
float d00 = x0 * x0 + y0 * y0 + z0 * z0;//Vector3.Dot(v0, v0);
float d01 = x0 * x1 + y0 * y1 + z0 * z1;//Vector3.Dot(v0, v1);
float d11 = x1 * x1 + y1 * y1 + z1 * z1;//Vector3.Dot(v1, v1);
float d20 = x2 * x0 + y2 * y0 + z2 * z0;//Vector3.Dot(v2, v0);
float d21 = x2 * x1 + y2 * y1 + z2 * z1;//Vector3.Dot(v2, v1);
float denom = d00 * d11 - d01 * d01;
v = (d11 * d20 - d01 * d21) / denom;
w = (d00 * d21 - d01 * d20) / denom;
u = 1.0f - v - w;
}
public Vector3 Resolve(ref Vector3 a, ref Vector3 b, ref Vector3 c)
{
//return a * u + b * v + c * w;
Vector3 q;
q.x = a.x * u + b.x * v + c.x * w;
q.y = a.y * u + b.y * v + c.y * w;
q.z = a.z * u + b.z * v + c.z * w;
return q;
}
public bool Within()
{
return (u >= 0.0f && u <= 1.0f) && (v >= 0.0f && v <= 1.0f) && (w >= 0.0f && w <= 1.0f);
}
}
}