我找了又找,找不到任何资源。我想用一个轴对齐的边界框来裁剪一个三角形(我经常看到相反的情况,一个三角形用轴对齐的边框裁剪,但从来没有相反的情况)。我试着计算裁剪的天角,然后从中构建一个边界框。但这非常无效,我认为我的代码不正确。有人知道如何如此有效地将边界框夹在三角形上吗?

这是我的代码:

typedef uint8_t  u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
typedef int8_t   s8;
typedef int16_t  s16;
typedef int32_t  s32;
typedef int64_t  s64;
typedef float    f32; //floating 32
typedef double   f64; //floating 64

typedef struct Point
{
    union
    {
        f32 a[3];
        struct
        {
            f32 x;
            f32 y;
            f32 z;
        };
    };
} Point;

typedef struct Vec4f
{
    union
    {
        f32 v[4];
        struct
        {
            f32 x;
            f32 y;
            f32 z;
            f32 w;
        };
    };
} Vec4f;

typedef struct BoundingBox
{
    Vec4f m_vMin = {FLT_MAX,FLT_MAX,FLT_MAX,0.f};
    Vec4f m_vMax = {-FLT_MAX,-FLT_MAX,-FLT_MAX,0.f};
} Vec4f;

inline
s8 Classify( s8 sign, u8 axis, const Point *c_v, const Point *p_v )
{
    const f64 d = sign * ( p_v->a[axis] - c_v->a[axis] );
    if ( d > EPSILON )
    {
        return  1;
    }
    else if ( d < -EPSILON )
    {
        return -1;
    }
    return  0;
}

#define POINT_BUFFER_SIZE 9

inline
void Clip3D_plane( Point *pVerts, s8 sign, u8 axis, u8 *pdwNumVerts, const Point *pPointOnPlane )
{
    u8 dwNumVerts = ( *pdwNumVerts );
    if ( dwNumVerts == 0 )
    {
        return;
    }
    else if ( dwNumVerts == 1 )
    {
        *pdwNumVerts = 0;
        return;
    }

    Point vNewVerts[POINT_BUFFER_SIZE];
    u8 k = 0;
    bool b = true; // polygon is fully located on clipping plane

    Point v1 = pVerts[dwNumVerts - 1];
    s8 d1 = Classify( sign, axis, pPointOnPlane, &v1 );
    for ( u8 j = 0; j < dwNumVerts; ++j )
    {
        const Point &v2 = pVerts[j];
        s8 d2 = Classify( sign, axis, pPointOnPlane, &v2 );

        if ( d2 != 0 )
        {
            b = false;
            if ( ( 0x80 & ( d2 ^ d1 ) ) != 0 ) //if signs differ
            {
                const f32 fAlpha = ( v2.a[axis] - pPointOnPlane->a[axis] ) / ( v2.a[axis] - v1.a[axis] );
                Point_Lerp( &v2, &v1, fAlpha, &vNewVerts[k++] );
            }
            else if ( d1 == 0 && ( k == 0 || !Point_Equals( &vNewVerts[k - 1], &v1 ) ) )
            {
                vNewVerts[k++] = v1;
            }

            if ( d2 > 0 )
            {
                vNewVerts[k++] = v2;
            }
        }
        else
        {
            if ( d1 != 0 )
            {
                vNewVerts[k++] = v2;
            }
        }

        v1 = v2;
        d1 = d2;
    }

    if ( b )
    {
        return;
    }

    *pdwNumVerts = k;
    for ( u8 j = 0; j < k; ++j )
    {
        pVerts[j] = vNewVerts[j];
    }
}

inline void BoundingBox_Append( BoundingBox3 *pBB, const Point *pvPoint )
{
    pBB->m_vMin.x = min( pBB->m_vMin.x, pvPoint->x );
    pBB->m_vMin.y = min( pBB->m_vMin.y, pvPoint->y );
    pBB->m_vMin.z = min( pBB->m_vMin.z, pvPoint->z );
    pBB->m_vMax.x = max( pBB->m_vMax.x, pvPoint->x );
    pBB->m_vMax.y = max( pBB->m_vMax.y, pvPoint->y );
    pBB->m_vMax.z = max( pBB->m_vMax.z, pvPoint->z );
}

void BoundingBox_ClipAndAppendTri( BoundingBox3 *pBB3, Point *pVerts, u8 *phwNumVerts, const BoundingBox3 *pClipBox )
{
    for ( u8 axis = 0; axis < 3; ++axis )
    {
        Clip3D_plane( pVerts, 1, axis, phwNumVerts, &pClipBox->m_vMin );
        Clip3D_plane( pVerts, -1, axis, phwNumVerts, &pClipBox->m_vMax );
    }
    for ( u8 vert = 0; vert < *phwNumVerts; ++vert )
    {
        BoundingBox_Append( pBB3, &pVerts[vert] );
    }
}

下面是描述我目前所做工作的图片

enter image description hereenter image description hereenter image description here

如何根据三角形剪裁轴对齐的边界框的更多相关文章

  1. ios – 如何让SpriteKit Playgrounds在Xcode 8 beta中运行?

    我希望能够在Playgrounds中轻松构建我的SpriteKit代码原型.这在Xcode7中工作正常在Xcode7中,我得到了一个很好的实时视图这在Swift3和Version8.0beta3中不起作用.我需要改变什么?解决方法XCPlayground模块已被PlaygroundSupport取代:

  2. Swift语言和其他计算机语言的比较

    Swift集成了传统面向对象编程语言的特性,同时又具备函数式编程的一些特征。在2014年WWDC之前,用来开发iOS应用的语言被称为Objective-C,它是标准C语言的扩展。使用Objective-C可以完成C语言所能完成的任何工作。这里不得不提到C++语言,事实上C++和Objective-C语言几乎是同时出现的。和Objective-C语言的简洁不同,C++语言几乎包含了所有可能的特性。

  3. Swift Name Mangling - Swift语言的名字重整技术

    在比如C这样的语言中,任何给定的名字(符号)只能对应唯一的一个函数或数据,不需要名字重整。因此,c++编译器使用一组严格的编码规则“mangles”(重整)了符号。想获取更多的关于经典C++编译器重整名字的内容,请参考ItaniumC++ABIdocumentation.总结:Object-C类似于C语言,Swift类似于C++,有函数重载,有虚函数表,需要命名重整。

  4. 你是如何评价Swift的,谈谈你的感受!

    假如之前已经掌握了Objective-C,切换到Swift也不难。Swift还没有很好地解决好跟C和C++混编的问题。随着时间推移,Swift在整个iOS/Mac工程中占的代码比例会越来越多,而Objective-C作为粘合层还是会存在。只是等你真正使用Swift编写一两个项目,就回不了头。Swift有些简便快速的写法,在Objective-C中是没有办法做到的。并且Swift的一些语言特性避免了很多Objective-C的坑。使用Swift编写的任何功能,使用Objective-C也可以做到,但是会麻烦

  5. 2017 年热门编程语言排行榜,你的语言上榜没?

    2016年11月的排名结果显示,Java依然是最受大家欢迎的语言,C和C++排名紧随其后。GitHub在2016年9月年度会议之前,Github在此分享了其统计报告。随后它在平台上公布了热门语言排行表。该公司支持30多种编程语言,用户可随心选择。按照使用量排名,Java排在第一位,Javascript,PHP和C以一万多的差距尾随其后。

  6. 在Android上解码Java或C/C++中的Airplay数据包

    提前致谢马特解决方法虽然Java编译为在虚拟机中运行的字节码,但它可能不一定比本机编译的可执行文件更慢(或更快).这一切都取决于程序!在这种情况下,Java可能会变慢,原因有很多:>解码实现可能只是编码/优化不佳?(我必须在这里注意,我不是Java的专家!)但是,我仍然不会调用Java本质上比C或C慢.我相信你可以在互联网上找到many-abenchmarks和测试,比较一种语言和另一种语言,有些人声称在一定程度上(出于骄傲和自我?

  7. Java C++ leetcode执行一次字符串交换能否使两个字符串相等

    这篇文章主要为大家介绍了Java C++ leetcode1790执行一次字符串交换能否使两个字符串相等,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. node.js调用C++开发的模块实例

    这篇文章主要介绍了node.js调用C++开发的模块实例,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node,需要的朋友可以参考下

  9. Java C++题解leetcode886可能的二分法并查集染色法

    这篇文章主要为大家介绍了Java C++题解leetcode886可能的二分法并查集染色法实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. Java C++题解leetcode904水果成篮

    这篇文章主要为大家介绍了Java C++题解leetcode904水果成篮示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 如何扩展ATmega324PB微控制器的以下宏寄存器?

    我目前正在学习嵌入式,我有以下练习:展开以下宏寄存器:如果有人解决了这个问题,我将不胜感激,以便将来参考

  2. Python将ONNX运行时设置为返回张量而不是numpy数组

    在python中,我正在加载预定义的模型:然后我加载一些数据并运行它:到目前为止,它仍在正常工作,但我希望它默认返回Tensor列表,而不是numpy数组。我对ONNX和PyTorch都是新手,我觉得这是我在这里缺少的基本内容。这将使转换中的一些开销相同。

  3. 在macOS上的终端中使用Shell查找文件中的单词

    我有一个文本文件,其中有一行:我需要找到ID并将其提取到变量中。我想出了一个RexEx模式:但它似乎对我尝试过的任何东西都不起作用:grep、sed——不管怎样。我的一个尝试是:我为这样一个看似愚蠢的问题感到抱歉,但我在互联网上找不到任何东西:我在SO和SE上读了几十个类似的问题,并在谷歌上搜索了几个教程,但仍然无法找到答案。欢迎提供任何指导!

  4. react-chartjs-2甜甜圈图中只有标题未更新

    我正在使用react-chartjs-2在我的网站中实现甜甜圈图。下面是我用来呈现图表的代码。我将甜甜圈图的详细信息从父组件传递到子组件,所有道具都正确传递。当我在beforeDraw函数外部记录props.title时,它会记录正确的值,但当我在beforeDraw函数内部记录props.title时,它将记录标题的前一个值,从而呈现标题的前值。我在这里做错了什么?

  5. 如何在tkinter中使用Python生成器函数?

    生成器函数承诺使某些代码更易于编写。但我并不总是知道如何使用它们。假设我有一个斐波那契生成器函数fib(),我想要一个显示第一个结果的tkinter应用程序。当我点击“下一步”按钮时,它会显示第二个数字,依此类推。我如何构建应用程序来实现这一点?我可能需要在线程中运行生成器。但如何将其连接回GUI?

  6. 如何为每次提交将存储库历史记录拆分为一行?

    我正在尝试获取存储库的历史记录,但结果仅以单行文本的形式返回给我。

  7. 尝试在颤振项目上初始化Firebase时出错

    当尝试在我的颤振项目上初始化firebase时,我收到了这个错误有人知道我能做什么吗?应用程序分级Gradle插件Gradle项目颤振相关性我已经将firebase设置为Google文档已经在另一个模拟器上尝试过,已经尝试过创建一个全新的模拟器,已经在不同的设备上尝试过了,已经尝试了特定版本的firebase,已经尝试添加但没有任何效果,已经在youtube上看到了关于它的每一个视频,该应用程序在android和iOS两个平台上都抛出了这个错误

  8. 在unix中基于当前日期添加新列

    我试图在unix中基于时间戳列在最后一个单元格中添加一个状态列。我不确定如何继续。

  9. 麦克斯·蒙特利。我一直得到UncaughtReferenceError:当我在终端中写入node-v时,节点未定义

    如果这是您应该知道的,请确认:我已将所有shell更改为默认为zsh。当我在终端中写入node-v时,我一直收到“UncaughtReferenceError:nodeisnotdefined”。但它显示节点已安装。我是个新手,在这方面经验不足。

  10. 如何在前端单击按钮时调用后端中的函数?

    那么如何在后端添加一个新的端点,点击按钮调用这个函数。

返回
顶部