Threejs-绘制可设置宽度的线

由于OpenGL Core Profile与大多数平台上WebGL渲染器的限制,无法直接绘制带宽度的线。
这里以线AB举例,实现思路主要是通过AB两点延伸出C~J八个点,再通过绘制三角形面的方式绘制出宽线。
在这里插入图片描述
说一下其中几个点的个人理解:
1.偏移方向确定后,计算偏移值。

// adjust for linewidth
offset *= linewidth;

// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...
offset /= resolution.y;

//此时offset是ndc空间下的偏移量,而linewidth的单位是像素,需要进行准换
//换一种更容易理解的写法

float lineWidthNDC = linewidth / resolution.y;

offset *= lineWidthNDC;

2.实现CDGH和EFIJ区域圆角绘制,保证多段线绘制时,拐点处顺滑。

if ( abs( vUv.y ) > 1.0 ) {

	float a = vUv.x;
	float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;
	float len2 = a * a + b * b;

	if ( len2 > 1.0 ) discard;

}

3.虚线效果,直接上图。其中 vLineDistance=像素点距起始点的距离;distace=mod( vLineDistance + dashOffset, dashSize + gapSize )

// 丢弃CDGH和EFIJ区域
if ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard;

// 丢弃间隙区域
if ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard;

在这里插入图片描述
案例及源码见three官网,点击查看.

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值