沿着曲线创建螺旋线

2024-02-04

我希望创建一个沿着曲线的螺旋,看看我在做什么,这个链接有一个代表它的 gif...

https://www.mapleprimes.com/posts/202940-Spiral-Around-The-Curve https://www.mapleprimes.com/posts/202940-Spiral-Around-The-Curve

(我对动画或其他几何形状不感兴趣,只是产生的粉红色螺旋)

理想情况下,我应该能够拥有任何形状的曲线,知道我想要的螺旋的直径/半径,并从中生成第二条曲线(螺旋),以恒定的螺距围绕它行进

我正在用 Javascript ( ThreeJS ) 做这个,但我认为它更像是一个一般的数学问题。

使用以下内容,我可以在直线部分周围获得螺旋,但当它改变方向/弯曲时,它会严重失败......

let helixPoints = [];
let helixDiameter = 30;

for (let t = 0; t < 1; t += 0.01) {
    let curvePoint = curve.getPointAt(t);
    let helixX = curvePoint.x + (helixDiameter * Math.cos(t*100));
    let helixY = curvePoint.y +(helixDiameter * Math.sin(t*100))
    let helixZ = curvePoint.z;

    helixPoints.push(new THREE.Vector3(helixX, helixY, helixZ));
}

let helixCurve = new THREE.CatmullRomCurve3(helixPoints);

我知道我需要对 helixZ 做更多的事情,我认为它遵循任何曲线,我可能需要在这些点处获取切线?

我只是无法理解数学,如果有人能指出我正确的方向,我将不胜感激


让螺旋线跟随螺旋线……这很有趣。可能有更好的方法来做到这一点,但这是我的解决方案:

我定义了一条曲线,就像获取初始螺旋线(演示中的黄线)一样。呼唤getPoints给了一堆Vector3对象,然后我将其付诸实践。

首先,从第二点开始,我回顾了上一点,形成了一个方向。这接近曲线的切线,但如果从曲线中收集的点较少,其准确性会降低。

接下来,我用一个up向量。我用了(0, 1, 0),但原始螺旋的方向可能需要您使用不同的方向。这个想法是up始终与切线方向相反,这样穿过切线就会产生垂直于曲线的矢量。

说到交叉向量,这就是我接下来所做的,并得到了一个很好的均匀向量束。然后我用了applyAxisAngle旋转垂直向量围绕切线根据当前点的索引计算出的量。

最后,将原始点位置添加到旋转向量中,我们得到 3D 空间中与旋转点等效的点,但遵循原始曲线。

您可以使用不同的值,例如temp长度和用于实现不同半径、频率等的间隔。

这是一个很大的挑战。感谢您的练习!如果您有任何疑问,请发表评论,我会尽力回答。

// prepare the renderer

let WIDTH
let HEIGHT
let aspectRatio = function() {
  return WIDTH / HEIGHT
}

const renderer = new THREE.WebGLRenderer({
  antialias: true,
  alpha: true
})
document.body.appendChild(renderer.domElement)

const camera = new THREE.PerspectiveCamera(32, aspectRatio(), 1, 1000)
camera.position.set(0, 0, 50)

function resize() {
  WIDTH = window.innerWidth
  HEIGHT = window.innerHeight
  renderer.setSize(WIDTH, HEIGHT)
  camera.aspect = aspectRatio()
  camera.updateProjectionMatrix()
}
resize()

window.addEventListener("resize", resize)

const scene = new THREE.Scene()

const light = new THREE.DirectionalLight(0xffffff, 1, Infinity)
light.position.set(0, 0, 1)
camera.add(light)

scene.add(camera)

// populate the scene

let group = new THREE.Group()
group.scale.set(5, 5, 5)
scene.add(group)

let curvePoints = []
let rad = Math.PI / 4
for (let i = -10; i <= 10; ++i) {
  curvePoints.push(new THREE.Vector3(i / 5, Math.sin(rad * i), Math.cos(rad * i)))
}
let curve = new THREE.CatmullRomCurve3(curvePoints)

let geoPoints = curve.getPoints(500);

let geo = new THREE.BufferGeometry().setFromPoints(geoPoints)
let mat = new THREE.LineBasicMaterial({
  color: "yellow"
})
let mesh = new THREE.Line(geo, mat)
group.add(mesh)

let dir = new THREE.Vector3()
let up = new THREE.Vector3(0, 1, 0)
let temp = new THREE.Vector3()
let amount = 0.25;
let innerHelixPoints = []
geoPoints.forEach(function(point, index, arr) {
  if (index > 0) {
    dir.subVectors(point, arr[index - 1])
    dir.normalize()
    temp.crossVectors(dir, up)
    temp.applyAxisAngle(dir, amount * index)
    temp.setLength(0.5)
    temp.add(arr[index - 1])
    innerHelixPoints.push(temp.clone())
  }
})

geo = new THREE.BufferGeometry().setFromPoints(innerHelixPoints)
mat = new THREE.LineBasicMaterial({
  color: "blue"
})
mesh = new THREE.Line(geo, mat)
group.add(mesh)

/* let geo = new THREE.BoxBufferGeometry(10, 10, 10)
let mat = new THREE.MeshLambertMaterial({
    color: "red"
})
let mesh = new THREE.Mesh(geo, mat)
scene.add(mesh) */

function updateObjects() {
  group.rotation.x += 0.001
  group.rotation.y += 0.002
}

// rendering functions

function render() {
  renderer.render(scene, camera)
}

let animationLoopId = null

function animationLoop() {
  animationLoopId = requestAnimationFrame(animationLoop)
  updateObjects()
  render()
}

animationLoop()
html,
body {
  padding: 0;
  margin: 0;
  overflow: hidden;
  background: slateGray;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/93/three.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

沿着曲线创建螺旋线 的相关文章

  • 是否有可能比 O(n log n) 更好地计算数字列表的中位数?

    我知道可以在 O n 中计算数字列表的平均值 但是中位数呢 有没有比排序 O n log n 和查找中间元素 或者如果列表中有偶数个项目则两个中间元素的平均值 更好的算法 是的 您可以在 O n 时间内 确定性地 完成此操作 http ww
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • Java中的字符算术

    在玩的过程中 我遇到了一些对我来说似乎很奇怪的事情 以下不是有效的 Java 代码 char x A x x 1 possible loss of precision 因为其中一个操作数是整数 所以另一个操作数被转换为整数 结果无法分配给字
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • Android:如何获取小数点后的两位数?不想截断值

    如何获取小数点后仅两位数的双精度值 例如 如果 a 190253 80846153846 那么结果值应该像 a 190253 80 尝试 我尝试过这个 public static DecimalFormat twoDForm new Dec
  • LibGDX - 正确使用 Polygon 类

    我创造了Polygon包裹我的飞机的物体 飞机的大小TextureRegion是 256x74 但在游戏中这个尺寸是 70x20 所以 TextureRegion texRegsAirplane TextureRegion split te
  • THREE.JS,忽略父级的轮换

    我试图使子对象跟随父级位置并表现得像一个普通的子对象 但是我希望它保持其旋转不变 在不影响性能的情况下 最好的方法是什么 我的CPU预算很紧张 已经运行了2个工作线程并且有很多对象 是否有设置只允许孩子的位置受到影响 同样重要的是 当父级旋
  • Three.js 椭圆

    如何在 Three js 中创建一个椭圆 我看过这个 在 THREE js 中绘制椭圆 https stackoverflow com questions 11419896 drawing an ellipse in three js 但如
  • 解决 Three.js / webGL 中的 gl_PointSize 限制

    我正在使用 Three js 创建交互式数据可视化 此可视化涉及渲染 68000 个节点 其中每个不同的节点具有不同的大小和颜色 最初我尝试通过渲染网格来实现此目的 但事实证明这非常昂贵 我当前的尝试是使用 Three js 粒子系统 每个
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 如何在Python中显示坐标网格线的变换?

    假设我有常规的笛卡尔坐标系 x y 并且我考虑一个矩形网格区域 D 分成小方块 我想看看域 D 如何在 Python 中的坐标变换 T x y gt u x y v x y 下映射 我正在寻找这样的东西 See here https mat
  • 渲染 ThreeJS 应用程序第一帧时的性能问题

    目前 当我渲染以下内容时 我的 ThreeJS 应用程序的性能受到很大影响第一帧 它会导致 Edge 和 IE 11 浏览器冻结 5 秒 并弹出窗口指示 此窗口没有响应 这可能会吓到我的用户 使用 Chrome 的性能分析器 问题似乎来自几
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 比较批处理文件中的两个数字

    我在这个网站上搜索了我的问题 但没有找到解决我问题的方法 系统为玩家和计算机提供一个从 2 到 12 的随机数 这有 3 部分 X 大于 Y 如果 X 小于 Y 以及当 X 与 Y 相同 当我开始 bat 效果很好 我选择Play Game
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半
  • 在 Blackberry 4.2 JDE 上调用 atan 函数

    我需要从我的 Blackberry Java 应用程序计算反正切值 不幸的是 blackberry 4 2 api 没有 Math atan 函数 Blackberry JDE 4 6 版有此功能 但 4 2 版没有 有谁知道计算 atan
  • 无面点云 (PLY) 文件的 Web 查看器

    我在尝试Three Js https github com mrdoob three js 用于通过网络查看 PLY 文件 使用这个例子 http threejs org examples webgl loader ply html作为参考

随机推荐

  • 内部矩阵尺寸误差必须符合绘图时的误差

    我正在尝试绘制函数 f x x e x cos x 从 0 到 2 pi 我尝试过运行 x 0 pi 100 2 pi y x exp x cos x 然而 每次我尝试设置 y Matlab 向我抛出 使用 时出错 并表示内部矩阵维度必须一
  • Hibernate 中的 UTF-8

    当我从 MySql 数据库的查询中检索信息时遇到问题 如下所示 Je b tirai UTF 8 字符集和 Hibernate 或 MySql 存在错误 请问我该如何解决这个问题 这是我的休眠设置
  • 对连接表进行序列化查询

    我正在尝试使用sequelize 查询连接表 这是模型 db client belongsToMany db user through db clientUser onDelete cascade db user belongsToMany
  • 浏览器在动画/移动元素上未触发鼠标悬停/鼠标输入

    如果您有一个具有移动动画的元素 mouseover and mouseenter除非用户移动鼠标 否则不会触发事件 为了演示 请使用 jQuery 尝试下面的代码块 如果您将鼠标放在移动的 div 前面 这样当 div 经过时您就不会移动鼠
  • MySql Xml 函数的性能?

    我对新的感到非常兴奋Mysql XML 函数 http dev mysql com doc refman 5 1 en xml functions html function updatexml 现在我终于可以在我的老式关系数据库中嵌入 面
  • Flurry Analytics 在 Android 模拟器中“运行”时崩溃,但在模拟器中“调试”时不会崩溃

    根据标题 我有一个应用程序 它使用乱舞分析 http www flurry com flurry analytics htmlAndroid 的库 我已经关注了他们的基本步骤 http support flurry com index ph
  • 在 Windows 桌面上制作 3D 对象动画

    我需要在 Windows 桌面上绘制用户可以与之交互的 3D 对象 例如狗 并为其设置动画 用户交互假设点击 显示 不规则形状 对话框以供用户输入等 您知道实现这一目标的具体方法吗 我想我有几种选择 有什么建议吗 哪一种最好 最简单 WPF
  • Microsoft OLE DB Provider for SQL Server 错误“80040e14”“=”附近的语法不正确

    当我尝试使用以下代码从数据库检索数据时 出现此错误 有人可以帮忙吗 set rs Server CreateObject ADODB recordset sql SELECT from COMPANY WHERE COMPANY ID Re
  • 如何使用 pandas 绘制阴影条?

    我试图通过填充图案而不是 仅 颜色来实现差异化 我如何使用熊猫做到这一点 在 matplotlib 中可以通过传递hatch所讨论的可选参数here https stackoverflow com questions 14279344 ho
  • Python 中的条件评估调试语句

    Python 有几种打印 trace 输出的方法 print import logging stdout write可用于打印调试信息 但它们都有一个缺点 即使记录器的阈值太高或流关闭 Python 仍会评估打印语句的参数 严格评估 这可能
  • 将一些 LISP 转换为 C#

    我正在阅读保罗 格雷厄姆的垃圾邮件计划 http www paulgraham com spam html想要更好地理解它 但我的 LISP 真的很生疏 他有一段计算概率的代码片段 let g 2 or gethash word good
  • R 中 glmnet 图的图例标签错误

    我修改了这篇文章中的函数 在 R 中的 glmnet 图中的曲线上添加标签 https stackoverflow com questions 30560689 adding labels on curves in glmnet plot
  • Windows 进程的内存映射是什么样的?

    这可能是一个重复的问题 我想知道windows进程的内存映射是什么样的 我正在寻找细节 请提供博客 文章和其他相关文献的链接 我总是喜欢能够真正看到事物 而不仅仅是阅读理论 事实证明 根据这篇博文 http www nynaeve net
  • 更改seabornpairplot对角线颜色

    当使用sns pairplot我有这个 import seaborn as sns iris sns load dataset iris g sns pairplot iris markers kind reg diag kind kde
  • 将 Char 转换为 AnsiChar 或 WideChar (Delphi)

    我正在将一个非常旧的 10 多年 应用程序升级到最新的 Delphi XE 我不断遇到很多错误 Incompatible types WideChar and AnsiChar 我只是将 char 转换为正确的类型 例如 AWideChar
  • IIS下的NetworkService有空的AppData路径

    在 Windows 8 上使用 IIS 8 我设置了一个以以下身份运行的应用程序池Network Service 在页面的代码中 我调用 Environment GetFolderPath Environment SpecialFolder
  • Leaflet自定义图标标记旋转一个角度,变换样式冲突

    我通过以下演示重现了这个问题 http jsfiddle net baoqger deL0yuvg 9 http jsfiddle net baoqger deL0yuvg 9 在我的项目中 我有一个自定义图标标记 我想在某些情况下旋转图标
  • MethodChannel、EventChannel 和 BasicMessageChannel 之间有什么区别?

    在 Flutter 中 分为三种类型平台渠道 我想知道它们之间的区别 这些通道用于在本机代码 插件或项目内的本机代码 和 Flutter 框架之间进行通信 方法通道 A MethodChannel是用来 使用以下方式与平台插件进行通信异步方
  • MVP - 视图应该能够直接调用演示者方法还是应该始终引发事件?

    我在 ASP NET 中使用 MVP 模式已经有一段时间了 我坚持从视图中引发演示者事件的定义模式 让我震惊的是 我可以在演示者中公开视图可以直接调用的方法 从技术上讲 使用直接方法调用将需要更少的代码 另一个好处是我倾向于在提供类似功能的
  • 沿着曲线创建螺旋线

    我希望创建一个沿着曲线的螺旋 看看我在做什么 这个链接有一个代表它的 gif https www mapleprimes com posts 202940 Spiral Around The Curve https www maplepri