Как использовать Embree с квадратами?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать Embree с квадратами?

Сообщение Anonymous »

Я попытался использовать Embree в одном из моего проекта, чтобы ускорить некоторые вычисления с трассией лучей. Тем не менее, один запуск по двум Embree не вычисляет вообще не пересечение. Тем не менее, я хочу пропустить первый край квадрата. Поскольку я не знаю, как вычислить пересечение с 2D-геометрией, я просто создаю трехмерную геометрию Quad. /> < /ol>
#include
#include
#include
#include
#include
#include
#include

std::string translateEmbreeError(RTCError error)
{
switch(error)
{
case RTC_ERROR_NONE:
return "no error occured";
case RTC_ERROR_INVALID_ARGUMENT:
return "an unknown error has occured";
case RTC_ERROR_INVALID_OPERATION:
return "the operation is not allowed for the specified object";
case RTC_ERROR_OUT_OF_MEMORY:
return "there is not enough memory left to complete the operation";
case RTC_ERROR_UNSUPPORTED_CPU:
return "the CPU is not supported as it does not support the lowest ISA Embree is compiled for";
case RTC_ERROR_CANCELLED:
return "the operation got canceled by a memory monitor callback or progress monitor callback function";
default:
return "unknown error";
}
}

struct RayQueryContext
{
RTCRayQueryContext context;
unsigned int skipFacet;
};

void intersectionFilter(const RTCFilterFunctionNArguments* args);

int main()
{
RTCDevice device = rtcNewDevice("set_affinity=1");
if(device == NULL)
throw std::runtime_error("failed to create embree device: " + translateEmbreeError(rtcGetDeviceError(NULL)));

RTCScene scene = rtcNewScene(device);
RTCError error = rtcGetDeviceError(device);
if(scene == NULL)
throw std::runtime_error("failed to create embree scene: " + translateEmbreeError(error));

rtcSetSceneFlags(scene, RTC_SCENE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS | RTC_SCENE_FLAG_ROBUST);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to set embree scene flags: " + translateEmbreeError(error));

RTCGeometry geom = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_QUAD);
error = rtcGetDeviceError(device);
if(geom == NULL)
throw std::runtime_error("failed to create embree geometry: " + translateEmbreeError(error));

rtcSetGeometryEnableFilterFunctionFromArguments(geom, true);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to set embree geometry flags: " + translateEmbreeError(error));

std::vector points = {
{0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f},
{1.0f, 0.0f, 0.0f}, {1.0f, -1.0f, 0.0f},
{1.0f, -1.0f, 0.0f}, {0.0f, -1.0f, 0.0f},
{0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 0.0f},
};

float* vb = static_cast(rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, 3*sizeof(float), 4*4));

for(std::size_t s = 0 ; s < 4 ; ++s)
{
//First point of segment
vb[12*s + 0] = points[2*s + 0][0];
vb[12*s + 1] = points[2*s + 0][1];
vb[12*s + 2] = 0.1f;
//Second point of segment
vb[12*s + 3] = points[2*s + 1][0];
vb[12*s + 4] = points[2*s + 1][1];
vb[12*s + 5] = 0.1f;
//Third point to make a quad
vb[12*s + 6] = points[2*s + 1][0];
vb[12*s + 7] = points[2*s + 1][1];
vb[12*s + 8] = -0.1f;
//Fourth point to make a quad
vb[12*s + 9] = points[2*s + 0][0];
vb[12*s + 10] = points[2*s + 0][1];
vb[12*s + 11] = -0.1f;
}

unsigned int* ib = static_cast(rtcSetNewGeometryBuffer(geom,
RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT4, 4*sizeof(unsigned int), 4));

for(std::size_t s = 0 ; s < 4 ; ++s)
{
ib[4*s + 0] = 4*s + 0;
ib[4*s + 1] = 4*s + 1;
ib[4*s + 2] = 4*s + 2;
ib[4*s + 3] = 4*s + 3;
}

rtcCommitGeometry(geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to commit embree geometry: " + translateEmbreeError(error));

rtcAttachGeometry(scene, geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to attach embree geometry: " + translateEmbreeError(error));

rtcReleaseGeometry(geom);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to release embree geoemtry: " + translateEmbreeError(error));

rtcCommitScene(scene);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
throw std::runtime_error("failed to commit embree scene: " + translateEmbreeError(error));

RTCRayHit rayHit;
rayHit.ray.org_x = 0.5f; rayHit.ray.org_y = 1.0f; rayHit.ray.org_z = 0.0f;
rayHit.ray.dir_x = 0.0f; rayHit.ray.dir_y = -1.0f; rayHit.ray.dir_z = 0.0f;
rayHit.ray.tnear = 0.0f;
rayHit.ray.tfar = std::numeric_limits::infinity();
rayHit.hit.geomID = RTC_INVALID_GEOMETRY_ID;

unsigned int facetToSkip = 0;

RayQueryContext context;
context.skipFacet = facetToSkip;
rtcInitRayQueryContext(&context.context);

RTCIntersectArguments args;
rtcInitIntersectArguments(&args);
args.context = &context.context;
args.filter = intersectionFilter;

rtcIntersect1(scene, &rayHit, &args);
if(rayHit.hit.geomID == RTC_INVALID_GEOMETRY_ID)
throw std::runtime_error("You did not intersect while you should ?");

rtcReleaseScene(scene);
error = rtcGetDeviceError(device);
if(error != RTC_ERROR_NONE)
std::cerr context);

unsigned int skipFacetUInt = context->skipFacet;

if(pHit->primID == skipFacetUInt)
args->valid[0] = 0;
else
args->valid[0] = -1;
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... with-quads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»