Questions tagged «geometry»

数学的一个分支,涉及形状,大小,图形的相对位置以及空间的属性。

4
程序生成特定区域的建筑物
我和一个团队正在开发一个工厂建造者游戏,该游戏在游戏开始时为玩家提供一个随机的工厂。为了确保有一种“公平”的感觉,理想情况下,随机生成的工厂的面积应在(占位符值)30的几个单位内。 编写满足这些规范的基本随机矩形生成器相对简单,但我们的目标是使工厂变得更加复杂,可能由2个,3个甚至4个相交的矩形组成,从而产生更复杂的形状(例如L, U和O形建筑物)。 我尝试生成一个随机矩形,然后使用基本代数填充第二个矩形,但是到目前为止,我并没有实现超过2个矩形的运气,即使如此,我对仅2个矩形设计的结果也不满意。 一些更相关的信息:2D自上而下一些机制是factorio样式,因此房间应该具有合理的长度和宽度,以便为机械留出空间(目前在Java和Lua中使用)(可以根据需要使用内置的库) 提前致谢! 编辑:当我说“好”或“坏”的输出时,不良的输出将是具有播放器无法使用的空间的任何输出。工厂形状限制了玩家可以放置工厂机器(例如传送带)的位置。理想情况下,工厂的区域不应只有1-2个块的宽度,形状不应该是一个或两个大的矩形,而将1-2个块的线“垂悬”到一侧。一个好的输出是所有地板空间都是“可行的”,因此所有区域至少应为3-4块宽。好的输出并不一定总是很复杂(可以使用1或2个矩形),但如果由超过1-2个矩形组成,则输出的机会就很大。


4
创建相邻三角形的算法
我有一个系统,您可以单击一次以在场景中放置节点。当您放置3个节点时,它将形成一个三角形。当您放置任何将来的节点时,它将通过将该节点连接到最近的2个现有节点来创建一个新的三角形。 这在大多数情况下都可以正常工作,但是在接近三角形的锐角附近使用时存在缺陷,因为两个最近节点之一通常不应该使用。 例如,请参见下图。品红色三角形是第一个放置的三角形。如果然后单击标记为X的位置,则得到的是蓝色叠加层所在的新三角形。我想要的是一个绿色覆盖的新三角形。(在此示例中,即与洋红色对称。澄清:绿色和洋红色三角形不重叠-绿色在蓝色一个下方延伸到最左侧的节点) 创建新三角形时如何确定要使用哪个2个现有顶点,以使三角形不会像这样叠加? 编辑:搜索最近的边缘会得到更好的结果,但不是完美的结果。考虑这种情况: “最近边缘”测试含糊不清,可以返回AB或AC(因为两者的最接近X的点都在A处)。期望的结果将是AC,以形成没有重叠边的ACX三角形。我如何确保这个结果?(如果可能的话,我宁愿不必作为决胜局进行单独的边缘重叠测试,因为考虑到浮点精度问题,我担心最接近的边缘测试不一定会发现2是等距的。)

1
将多个矩形“修复”为较少数量的矩形的算法?
假设我有一个不同形状和颜色的矩形网格,我想减少(合理地接近最佳值就可以了,不需要最佳值)代表相同颜色布局的矩形数。 上图是一个非常简化的情况,矩形之间的空白仅用于可视化-它们实际上是紧密包装的。 可以帮助我做到这一点的方法或算法名称(对Google满意)是什么?


6
检查两个移动的AABB是否相交的最快方法是什么?
我有两个正在移动的AABB,检查它们是否在框架下相交的最快方法是什么? 通过移动,我的意思是不仅要检查常用的矩形交集方法,还意味着某种简单易行的测试,该测试仅返回布尔值,没有命中时间或其他任何东西。 我认为就是这样简单地做到这一点: 但是那个Hexagon非常复杂,我不知道如何计算AABB-多边形相交,也许有更简单的方法吗? 您最喜欢的任何编程语言,我都可以轻松移植。 谢谢。

1
如何用矩形块制作曲面?
对于类似Peggle的游戏,我要制作遵循曲线的块,如下所示: 然后,当球击中障碍物时,障碍物将消失。 我设法水平绘制了一些,但是在使它们遵循一条路径时遇到了麻烦: 我该怎么做呢?是否需要使用自定义顶点创建Box2D对象?

4
我如何找到适合于平截头体的最大球体?
您如何找到可以透视的最大球体? 从顶部看,是这样的: 补充:在右边的视锥台上,我已经指出了四点,我认为我们对此有所了解。我们可以投影出截头圆锥体的所有八个角以及近端和远端的中心。因此我们知道点1、3和4。我们也知道点2与3之间的距离与4与点3之间的距离相同。因此,我们可以计算线1到4到点2的最近点,以获得中央?但是实际的数学和代码使我无所适从。 我想绘制尽可能大的模型(大约是球形的,我有一个微型球的边界球)。 更新:我已经尝试按照 bobobobo和Nathan Reed的建议实施“在两个平面上作圆”方法: function getFrustumsInsphere(viewport,invMvpMatrix) { var midX = viewport[0]+viewport[2]/2, midY = viewport[1]+viewport[3]/2, centre = unproject(midX,midY,null,null,viewport,invMvpMatrix), incircle = function(a,b) { var c = ray_ray_closest_point_3(a,b); a = a[1]; // far clip plane b = b[1]; // far clip plane c = c[1]; // camera var A = …
12 geometry 

2
球体的任意旋转
我正在编写一种机制,允许用户在球体表面周围移动。球面上的位置当前存储为theta和phi,其中theta是当前位置的z轴和xz投影之间的角度(即围绕y轴的旋转),并且phi是从y轴到该位置的角度。我解释得很差,但实际上theta = yaw,phi = pitch Vector3 position = new Vector3(0,0,1); position.X = (float)Math.Sin(phi) * (float)Math.Sin(theta); position.Y = (float)Math.Sin(phi) * (float)Math.Cos(theta); position.Z = (float)Math.Cos(phi); position *= r; 我相信这是正确的,但是我可能是错的。我需要能够在半径为的世界空间的起点处围绕球体表面在任意伪二维方向上移动r。例如,握持区W应相对于玩家的方向在球体上方向上移动。 我相信我应该使用四元数来表示球体上的位置/方向,但是我想不出正确的方法。球形几何不是我的强项。 本质上,我需要填写以下内容: public void Move(Direction dir) { switch (dir) { case Direction.Left: // update quaternion to rotate left break; case Direction.Right: // update …

3
Minecraft动画是否已硬编码到游戏中?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 5年前关闭。 我想知道动画系统在《我的世界》中的运作方式。我觉得所有小怪都是硬编码到游戏中的。刻痕真的坐在那里,用手为所有动画骨骼创建矩阵吗? 我喜欢重新创建有趣的游戏,所以我想知道他是如何做到的。另外,如果他确实对它们进行了硬编码,还有更好的方法吗?


1
镶嵌与几何着色器
如果我错了,请纠正我,但是“几何着色器”和“细分曲面着色器”作业都将在“图形管线”中生成顶点。我想知道的是它们之间的区别,何时应该在另一个之上使用?

2
如何将点击拖动动作限制在某个区域?
对于某些通用标题,我深表歉意。我真的对如何完成我想做的事情并不了解,这甚至使研究可能的解决方案变得更加困难。 我正在尝试实现各种路径标记(也许有一个最合适的名称,但这是我能想到的最好的名称)。 在玩家前面将有一个路径标记,它将确定玩家完成转弯计划后的移动方式。玩家可以单击并拖动标记到他们选择的位置,但是标记只能在定义的工作区域(灰色位)内移动。 所以我现在遇到两个问题: 首先,我应该如何准确定义该可行区域?我可以想象,可能有两个向量以玩家为起点来形成可行的角度,也许这两个弧线可能来自以玩家为中心的圆,但是我绝对不知道如何将所有这些一起。 其次,在定义了可以放置标记的区域之后,如何强制标记应仅停留在该区域内?例如,如果玩家单击并拖动标记,则标记可以在工作区域内自由移动,但不能离开该区域的边界。因此,举例来说,如果玩家开始向上拖动标记,它将向上移动,直到碰到工作区域的末端(下面的第一张图),但是如果此后玩家开始侧向拖动,则标记必须跟随拖动同时在区域内(下面的第二张图)。 我希望这不会太令人困惑。谢谢你们。 编辑:如果这有所作为,我将C + +与Marmalade SDK结合使用。

5
如何确定路径的长度?
我有一款游戏,要求每个玩家沿着一条指定的路径移动。我使用贝塞尔曲线绘制路径。如何确定路径的总真实(非线性)长度和每个玩家的距离?(起点和路径上指定点之间的距离。) 更新: 路径以笛卡尔平面(2D)表示。

1
圆线碰撞检测问题
我目前正在开发一个突破克隆,我遇到了障碍,无法正确检测球(圆)和砖(凸多边形)之间的碰撞。我正在使用“圆线碰撞检测”测试,其中每条线代表凸多边形砖上的边缘。 在大多数情况下,Circle-Line测试可以正常工作,并且可以正确解决碰撞点。 碰撞检测正常工作。 但是,有时候我的碰撞检测代码由于球实际上与砖相交时的负判别而返回false。 碰撞检测失败。 我知道这种方法的效率低下,并且使用了轴对齐的边界框来减少测试砖的数量。我主要关心的是下面的代码中是否存在任何数学错误。 /* * from and to are points at the start and end of the convex polygons edge. * This function is called for every edge in the convex polygon until a * collision is detected. */ bool circleLineCollision(Vec2f from, Vec2f to) { Vec2f lFrom, …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.