You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
|
5 days ago
|
#pragma once
|
||
|
|
|
||
|
|
#include "vector3.hpp"
|
||
|
|
#include "CommonStructs.hpp"
|
||
|
|
|
||
|
|
#include <vector>
|
||
|
|
#include <string>
|
||
|
|
|
||
|
|
struct Triangle {
|
||
|
|
Vector3 a;
|
||
|
|
Vector3 b;
|
||
|
|
Vector3 c;
|
||
|
|
};
|
||
|
|
|
||
|
|
using TriangleMesh = std::vector<Triangle>;
|
||
|
|
|
||
|
|
// ֻ��������� OBJ��
|
||
|
|
// v x y z
|
||
|
|
// f i j k (�� f i/j/k ��ʽ��1-based ��������)
|
||
|
|
// ����������/����
|
||
|
|
bool loadObjAsTriangleMesh(const IniInPutStruct* inputData, size_t inputCount, TriangleMesh& mesh);
|
||
|
|
|
||
|
|
namespace GeometryUtils {
|
||
|
|
|
||
|
|
// P ����������������
|
||
|
|
void closestPointOnTriangle(
|
||
|
|
const Vector3& p,
|
||
|
|
const Triangle& tri,
|
||
|
|
Vector3& closest,
|
||
|
|
float& dist2);
|
||
|
|
|
||
|
|
// P ��������������������
|
||
|
|
void closestPointOnMesh(
|
||
|
|
const Vector3& p,
|
||
|
|
const TriangleMesh& mesh,
|
||
|
|
Vector3& closest,
|
||
|
|
float& dist);
|
||
|
|
|
||
|
|
float signedDistanceToMesh(
|
||
|
|
const Vector3& p,
|
||
|
|
const TriangleMesh& mesh,
|
||
|
|
Vector3* outClosestPoint = nullptr,
|
||
|
|
Vector3* outNormal = nullptr);
|
||
|
|
|
||
|
|
float signedDistanceToMeshForEndpoint(
|
||
|
|
const Vector3& p,
|
||
|
|
const TriangleMesh& mesh,
|
||
|
|
Vector3* outClosestPoint,
|
||
|
|
Vector3* outNormal);
|
||
|
|
|
||
|
|
// �� mesh �������ҵ���� k ���������ѡ�㡱
|
||
|
|
void getSurfaceCandidatesOnMesh(
|
||
|
|
const Vector3& p,
|
||
|
|
const TriangleMesh& mesh,
|
||
|
|
int k,
|
||
|
|
std::vector<Vector3>& outPoints);
|
||
|
|
|
||
|
|
// ��������
|
||
|
|
void getSurfaceSlideCandidates(
|
||
|
|
const Vector3& p,
|
||
|
|
const TriangleMesh& mesh,
|
||
|
|
int k,
|
||
|
|
const Vector3* pathDir,
|
||
|
|
float slideRadius,
|
||
|
|
std::vector<Vector3>& outPoints);
|
||
|
|
|
||
|
|
bool findEndpointHitOnMesh(
|
||
|
|
const Vector3& p0,
|
||
|
|
const Vector3& p1,
|
||
|
|
const TriangleMesh& mesh,
|
||
|
|
float maxRayDist,
|
||
|
|
Vector3& hitPoint);
|
||
|
|
|
||
|
|
bool SegmentCollidesWithMesh(
|
||
|
|
const Vector3& P0,
|
||
|
|
const Vector3& P1,
|
||
|
|
const TriangleMesh& mesh,
|
||
|
|
double safe_epsilon);
|
||
|
|
|
||
|
|
bool IsSegmentCollides(
|
||
|
|
const Vector3& P0,
|
||
|
|
const Vector3& P1,
|
||
|
|
const TriangleMesh& mesh);
|
||
|
|
}
|