我已经研究了几个星期的问题,并且已经达到了我想确保我的方法不会过于复杂的地步。这是在 iOS 上的 OpenGL ES 2.0 中完成的,但原则是通用的,所以我不介意答案是纯数学形式的。这是概要。
我在 3D 空间中有 2 个点以及一个控制点,我用它来生成具有以下等式的贝塞尔曲线:
B(t) = (1 - t)2P0 + 2(1 - t)tP1 + t2P2
起点/终点位于一个相当大的球体上的动态坐标上,因此 x/y/z 变化很大,使得静态解决方案不那么实用。我目前正在使用 GL_LINE_STRIP 渲染这些点。下一步是使用 GL_TRIANGLE_STRIP 渲染曲线并控制相对于高度的宽度。
根据这个quick discussion ,解决我的问题的一个好方法是在考虑曲线方向的情况下找到与曲线两侧平行的点。我想总共创建 3 条曲线,传入索引以创建不同宽度的贝塞尔曲线,然后绘制它。
还有关于 interpolation 的讨论并使用 Loop-Blinn technique这似乎解决了各自问题的具体问题。但是,我相信这些解决方案对于我要追求的目标来说可能过于复杂。我也不感兴趣将纹理混入其中。我更喜欢使用稍后在我的着色器中计算的颜色绘制三角形。
因此,在我深入阅读三线性插值、Catmull-Rom 样条、Loop-Blinn 论文或进一步探索采样之前,我想确定哪个方向最有可能成为最佳选择。我想我可以说这个问题的最基本形式是在 3D 空间中取一个点并沿着它找到两个平行点,考虑到下一个点将被绘制的方向。
感谢您抽出宝贵时间,如果我能提供更多信息,请告诉我,我会尽力添加。
最佳答案
这个答案(据我所知)不支持您在问题中提到的方法之一,但这是我在这种情况下会做的。
我会计算曲线的归一化法线(或副法线)。假设我采用归一化法线并将其作为 t (N(t)) 的函数。有了这个,我会写一个辅助函数来计算偏移点 P:
P(t, o) = B(t) + o * N(t)
其中o表示曲线在法线方向上的有符号偏移。
给定这个函数,我们可以通过以下方式简单地计算曲线左侧和右侧的点:
Points = [P(t, -w), P(t, w), P(t + s, -w), P(t + s, w)]
其中w是你想要实现的曲线宽度。
然后通过两个三角形连接这些点。
对于在三角形带中使用,这意味着索引:
0 1 2 3
编辑
要对曲线做一些工作,通常会计算 Frenet 框架。
这是一组 3 个向量(切线、法线、副法线),在给定的参数值 (t) 下给出曲线的方向。
Frenet 框架由下式给出:
unit tangent = B'(t) / || B'(t) ||
unit binormal = (B'(t) x B''(t)) / || B'(t) x B''(t) ||
unit normal = unit binormal x unit tangent
在此示例中,x 表示两个向量和 || 的叉积v || 表示封闭向量 v 的长度(或范数)。
如您所见,您需要曲线的第一个 (B'(t)) 和第二个 (B''(t)) 导数。
关于ios - 数学/OpenGL ES : Draw 3D bezier curve of varying width,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10918715/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
ruby中有这样的东西吗?send(+,1,2)我想让这段代码看起来不那么冗余ifop=="+"returnarg1+arg2elsifop=="-"returnarg1-arg2elsifop=="*"returnarg1*arg2elsifop=="/"returnarg1/arg2 最佳答案 是的,只需像这样使用send(或者更好的是public_send):arg1.public_send(op,arg2)这是可行的,因为Ruby中的大多数运算符(包括+、-、*、/、andmore)只需调用方法。所以1+2与1.+(2)相同
当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#
当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab
情况:我正在编写一个程序来求解素数。我需要解决4x^2+y^2=n的问题,其中n是一个已知变量。是的,必须是Ruby。我愿意在这个项目上花费大量时间。我最好自己编写方程式的求解算法,并将其作为该项目的一部分。我真正喜欢的是:如果任何人都可以向我提供指南、网站的链接,或者关于与求解代数方程特别相关的形式算法的构造的歧义消除,或者向我提供似乎你是读者它会帮助我完成任务。请不要建议我使用其他语言。如果您在回答之前接受我真的非常想这样做,我将不胜感激。该项目没有范围或时间限制,也不以营利为目的。这是为了我自己的教育。注意:我并不直接反对为Ruby实现和使用现存的数学库/模块/其他东西,但我更喜
我发现许多Rails应用程序主要针对企业、社交网络类型的Web应用程序。我看到有人将Ruby与一些出色的OOPS语言(如Java和C#)进行了比较,但我确实发现很难获得一些数学密集型应用程序。非常感谢任何知识渊博的输入(指向示例程序的链接等),其中轻松显示了语言的用法,就像快速启动或显示该语言如何用于各种数学问题一样。 最佳答案 不幸的是,Ruby并没有在数学和科学计算领域涉足太多。目前,有一个名为SciRuby的pre-alpha库它试图为Ruby带来更多面向数学的功能。他们正试图构建一个NumPy/SciPy等价物。SciRub
我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文