Articles of 剪辑

如何检测玩家“清理”了多less物体?

我想让玩家从一本书上擦掉一些灰尘,然后开始一个简短的animation。 以下是它的样子: 我在“尘土飞扬”的书籍位图图像上使用裁剪区域,以便在玩家将鼠标移到其上时逐渐隐藏灰尘。 但是,我坚持如何检测什么时候灰尘全部消失了。 跟踪剩下多less的好方法是什么?

3D裁剪盒的标准位置是什么?

我理解3D渲染的方式是使用多个matrix来转换多边形,然后在投影到屏幕上之前,如果它们不在某个框内,就会将其裁剪掉。 在转化之前,可见区域通常是一个平截体,在转化之后,我猜测它是一个立方体。 这个立方体使裁剪math比平截头体更容易。 我的问题是,这个剪贴盒的“标准”位置/尺寸是多less? (0,0,0) – (1,1,1),(-0.5,-0.5,-0.5) – (0.5,0.5,0.5),(-1,-1, – 1) – (1,1,1) 还是没有标准?

libgdx ScissorStack问题

我使用libgdx制作用户界面我创建了一个Window类和一个Textfield类,都使用剪切。 我使用剪裁的libgdx的ScissorStack类。 Textfield是在窗口类中绘制的。 窗口绘制方法 : ScissorStack.calculateScissors(camera, batch.getTransformMatrix(), clipBounds, scissors); ScissorStack.pushScissors(scissors); //Draw textflied ScissorStack.popScissors(); Textfield绘制方法 : clipBounds.setPosition( 700, 200 ); //Draw textfield image ScissorStack.calculateScissors(camera, batch.getTransformMatrix(), clipBounds, scissors); ScissorStack.pushScissors(scissors); //Draw text ScissorStack.popScissors(); 目前的问题是这个代码的Textfield类: clipBounds.setPosition( 700, 200 ); 如果我删除这个代码,我不会得到错误。 这是错误的 : Exception in thread "LWJGL Application" java.lang.IllegalStateException: Array is empty. at com.badlogic.gdx.utils.Array.pop(Array.java:292) at com.badlogic.gdx.scenes.scene2d.utils.ScissorStack.popScissors(ScissorStack.java:77) 我注意到,如果我改变clipBounds的值,我得到的错误,有时,有些值,我没有得到错误。

立方贝塞尔多边形剪辑

我有一个大的立方贝塞尔定义的2D多边形区域,我需要在DX11中实时渲染所需的4096×4096纹理。 平均控制点数将在12k左右,我需要以16x分辨率来渲染它,这意味着对于每个单位的长度,我需要16个线段。 这使得不可能对生成的网格进行三角测量,因为多边形点的剪切数量需要几秒钟进行三角测量。 我想tessellating贝塞尔多边形,然后再削减ff,但因为我们正在谈论的实时渲染速度太慢(我需要能够实时修改贝塞尔多边形)很多的三角形。 为了增加伤害,多边形孔和斯坦纳点是一个要求,因为表面的颜色将来自不同的点“深度”。 在理想情况下,我会在镶嵌之前剪切贝塞尔多边形(对fastrum或更小的子多边形),但我不知道可以做到这一点的库。 我目前唯一的“想法”是将任何贝塞尔段切割成短于4个单元的子段,使用64级着色器镶嵌,然后根据控制点移动新的顶点,但不用说,这看起来过于复杂效率低下。

如何testing在Weiler-Athertonalgorithm中出现哪条边和哪条边出现?

Weiler-Atherton多边形裁剪algorithm的基础是: 从裁剪区域内的第一条边开始。 候选/主题多边形的边缘进入剪切区域时,保存交点。 当候选/主题多边形的边缘退出剪切区域时,保存交点并跟随剪切多边形。 如何testing哪个边缘正在进入,哪个边缘出来? 而且,我们如何确定进入的第一个边缘? 例如,如果我将多边形定义为, class Polygon2d { std::vector<Point2d> vertices; public: …… } 在哪里,一点是, class Point2d { double x; double y; public: …… } 而线段是, class Line2d { Point2d start, end; public: …… } 编码策略应该是什么?

在OpenGL中使用正交投影时,我应该使用XY平面吗?

目前,我在使用OpenGL中的正交投影来渲染基于瓦片的3D地图时感到茫然。 想象任何等距的3D游戏(使用实际的几何graphics代替精灵)。 在内部,我的地图瓷砖有x和y坐标(分别在地图内的column和row位置)。 x=0和y=0的瓦片是“左上角”的瓦片, y=0和x=1的瓦片是第一个瓦片的右侧,依此类推。 由于在OpenGL中,坐标系统是这样的,XZ平面是“地面”平面,我通过使用matrix(或位置vector) z分量的瓦片的y坐标来为每个瓦片创建模型matrix。 然后我使用glm::ortho()设置了一个正交“相机”。 这似乎起初工作正常,但当试图渲染地图的大部分时,我很快遇到了裁剪问题。 我认为这是由于正交投影夹在z上的事实。 在XY平面上进行地图的快速和肮脏的尝试证实了这一点,因为我没有裁剪问题。 现在,我不确定这里最好的方法是什么? 更改代码,使瓷砖铺设在XY平面上? 在这种情况下,似乎我将不得不记住围绕x旋转每个对象,这似乎是错误的。 我是否需要手动设置正交投影才能将Y用作裁剪平面? 这甚至可能吗? 我认为OpenGL总是使用z剪辑,对吧? 其他一些方法? 我觉得我迷失在坐标和matrix中,真的。 我认为这是一个众所周知的解决scheme的常见问题,所以我希望在我继续之前了解这一点,改变很多,然后学习我做了错误的方式…

投影是否在裁剪渲染管线之前发生?

起初,我认为裁剪发生在投影之前,因为可能会添加新的顶点,投影的输出在二维的NDC。 然而,经过大量的search,我发现一些文章/演示/图像表明,投影发生在裁剪之前,与我读过的其他文章和我的初步想法相矛盾。 谁能告诉我哪一个是正确的,为什么?

自定义3D渲染器:Frustum剪辑

我最近一直在玩弄从头开始创建一个3D渲染器的想法,并且在仔细观察之后,似乎并不像听起来那样是一个巨大的任务。 昨天晚上,因为我有很多的想法,所以我正在折腾和翻身,原本打算把整个渲染器从一个索引系统的基础上用向量列表来隐藏,我不需要那些点,但是抛出了窗口,我意识到我需要在主要呈现的优先顺序。 正如大多数基于3D的开发人员所知道的,所有的顶点都在视口周围移动 。 对于想要进行第三人/第一人称游戏的人来说,这是一场噩梦,因为如果你不了解半高级几何,那么你实际上已经搞错了。 我意识到人们最终必须知道他们的和他们的东西,但是我想通过使视口(matrix)在“世界”周围移动来释放这个负担。 这对于性能来说肯定更好,因为移动一个matrix必须更容易计算gpu / cpu。 我可能是完全错误的,但我想放弃这一点。 在我的脑海里, 各种各样的作品会产生一个“3D”世界。 在这一点上唯一阻止我跳入C ++和SFML / SDL的是我的程序的一个bug(或者技术上的“未实现的特性”)。 我想让我的渲染器工作的方式是这样的: 查找视口内的所有顶点。 (让我们称这些V []) 获取所有V []的深度信息 在特定的V []之间画线(在我的情况下,一个V将包含内存中下一个要连接的V的信息)。画线只用于debugging目的或者用于kewl 80的外观。 保存为多边形。 在poly边界内填充颜色/纹理以显示深度或devise。 我认为这应该起作用。 但有一个问题,这个问题是我发布这一切的原因。 假设我们有一个更大/不完全的视锥体,而相机没有看顶点,那么我们怎么会发现这里有一个“形状”。 我将在MS Paint中画一个蹩脚的例子来解释。 (没有人花时间为Photoshop ..) 任何帮助表示赞赏,并完全理解,如果我写的不'点击'。 谢谢!

在OpenGL中执行手动裁剪

我正在学习OpenGL,并且我明白,OpenGL作为stream水线的一部分来执行裁剪,但是也执行手动裁剪是一个好主意吗? 通过手动裁剪,我的意思是不要求GPU绘制一个对象,如果我确定它不会在屏幕上可见。 我能想到的好处是,GPU不会浪费时间来执行顶点着色器,只会发现要丢弃的原语。 另一方面,在CPU上执行计算可能会导致整体性能下降。 我相信世界地形模型是一次加载的,所以对地形进行手动剪裁并在GPU的内存中重新加载选定的部分不是一个好主意,但也许这样做是为了提高性能。 谢谢!

旋转期间XNA雪碧剪切不正确

我在XNA的精灵画面靠近屏幕边缘时遇到了一些麻烦。 貌似如果你使用SpriteBatch绘制,那么XNA不会绘制它,例如(mPosition.X + mSpriteTexture.Width <0),因为它假定它是离屏的。 但是,它似乎在应用轮换之前做出这个决定。 这种旋转可能意味着即使(mPosition.X + mSpriteTexture.Width <0),一些精灵在屏幕上仍然可见。 编辑:旋转是问题的一部分只是一个假设,但澄清,因为精灵以稳定的速度(以一个小的恒定速度)向屏幕边缘移动,它会突然消失时,它仍然是部分(通常大约一半的精灵)在屏幕上。 我的问题是,是否有办法让它进一步绘制在视口之外或临时禁用spriteBatch.draw(…)期间的精灵剪辑? sb.Draw(mSpriteTexture, mPosition, new Rectangle(0, 0, mSpriteTexture.Width, mSpriteTexture.Height), Color.White, Globals.VectorToAngle(mOrientation), new Vector2(halfWidth, halfHeight), scale, SpriteEffects.None, 0);