Laya 3D 画线

使用Laya的 PixelLineSprite3D 像素线渲染精灵,画出来的线条不能调整粗细。目前想到的是通过,多画一些线条,使看起来的线条变粗。最终解决办法是,将线段的起点和线段的终点,扩城圆。用生活的例子举例,就是,拿个圆环在沙子上拖,最终拖出来的效果。画出来的效果如下图所示。

源码

/**

* 圆形画笔(适用用于 X Z平面)

* by leo

*/

export default class CirclePaint {

/**线段数组 */

private _lineSprite3Ds: Array<Laya.PixelLineSprite3D> = null;

/**线段起点 */

private _starVec3: Laya.Vector3 = null;

/**线段终点 */

private _endVec3: Laya.Vector3 = null;

/**加宽线数量 */

private _lineNum: number = 100;

/**笔刷半径 */

private _paintRadius: number = 0;

/**每条线 的最大线段数量 */

private _perLineMaxCount: number = 0;

/**圆上 两点之间的间隔角度 */

private _perAngle: number = 0;

 

/**

* 销毁函数

*/

public destroy(): void {

if (this._lineSprite3Ds) {

for (let piexlSprite3D of this._lineSprite3Ds) {

if (piexlSprite3D) {

piexlSprite3D.clear();

piexlSprite3D.removeSelf();

piexlSprite3D.destroy();

piexlSprite3D = null;

}

}

this._lineSprite3Ds.splice(0, this._lineSprite3Ds.length);

this._lineSprite3Ds = null;

}

}

 

/**

* 设置画笔

* @param parent 线段父对象

* @param lineNum 加宽线数量

* @param perLineMaxCount 每条线,最大线段数量

* @param radius 笔刷半径

*/

public setPaint(parent: Laya.Sprite3D, lineNum: number, perLineMaxCount: number, radius: number): void {

this._paintRadius = radius;

this._lineNum = lineNum;

this._perLineMaxCount = perLineMaxCount;

this._perAngle = 360 / lineNum;

this._lineSprite3Ds = new Array<Laya.PixelLineSprite3D>();

for (let i = 0; i < this._lineNum; i++) {

let pixelSprite3D = new Laya.PixelLineSprite3D(perLineMaxCount);

parent.addChild(pixelSprite3D);

this._lineSprite3Ds.push(pixelSprite3D);

}

this._starVec3 = new Laya.Vector3();

this._endVec3 = new Laya.Vector3();

}

 

/**

* 画线

* @param lastVec3 线段起点

* @param nextVec3 线段结束点

* @param color 颜色

*/

public drawLine(lastVec3: Laya.Vector3, nextVec3: Laya.Vector3, color: Laya.Color): void {

if (this._lineSprite3Ds) {

for (let index = 0; index < this._lineSprite3Ds.length; index++) {

let line = this._lineSprite3Ds[index];

if (line != null) {

this.setCircleVec3(lastVec3, this._starVec3, index);

this.setCircleVec3(nextVec3, this._endVec3, index);

// 项目需要限制高度,遮挡,去掉无影响

this._starVec3.y = 0.04;

this._endVec3.y = 0.04;

line.addLine(this._starVec3, this._endVec3, color, color);

}

}

}

}

 

/**

* 清理画线

*/

public clearLine(): void {

if (this._lineSprite3Ds) {

for (let piexlSprite3D of this._lineSprite3Ds) {

if (piexlSprite3D) {

piexlSprite3D.clear();

}

}

}

}

 

/**

* 线段数量是否超过限制

*/

public isMaxLineCount(): boolean {

let lineSp = this._lineSprite3Ds[0];

if (lineSp && lineSp.lineCount >= lineSp.maxLineCount) {

return true;

}

return false;

}

 

/**

* 最大线段数量

*/

public get maxLineCount(): number {

return this._perLineMaxCount;

}

 

/**

* 圆上的点

* @param centerVec3 中心点

* @param tagetVec3 圆上的点,

* @param index 下标

*/

private setCircleVec3(centerVec3: Laya.Vector3, tagetVec3: Laya.Vector3, index: number) {

let angle = this._perAngle * index * Math.PI / 180;

let xdis = Math.sin(angle) * this._paintRadius;

let zdis = Math.cos(angle) * this._paintRadius;

tagetVec3.x = centerVec3.x + xdis;

tagetVec3.y = centerVec3.y;

tagetVec3.z = centerVec3.z + zdis;

}

}

Laya3D是一款基于HTML5技术的3D游戏引擎,它可以运行在多个平台上,包括PC、移动设备和Web。实现战争迷雾效果需要以下步骤: 1. 创建一个地图模型,包括战场和障碍物。 2. 创建一个相机,并设置其位置和朝向,以便能够正确地观察地图。 3. 创建一个光源,可以使用点光源、方向光源或者环境光源。 4. 创建一些材质,用于给地图和障碍物上色。 5. 创建一个迷雾层,用于遮挡地图和障碍物。 6. 在场景中添加一个渲染器,用于将场景渲染到屏幕上。 7. 在每帧更新时,根据相机的位置和迷雾层的范围,计算出需要显示的部分,并将其渲染到屏幕上。 以下是一个简单的示例代码: ```javascript Laya3D.init(0, 0, true); // 创建场景和相机 var scene = Laya.stage.addChild(new Laya.Scene()); var camera = scene.addChild(new Laya.Camera(0, 0.1, 100)); camera.transform.translate(new Laya.Vector3(0, 10, -20)); camera.transform.rotate(new Laya.Vector3(-30, 0, 0), true, false); // 创建光源 var light = scene.addChild(new Laya.DirectionLight()); light.color = new Laya.Vector3(1, 1, 1); light.direction = new Laya.Vector3(0.3, -1, 0); // 创建地图模型和材质 var map = scene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createPlane(50, 50))); var mapMat = new Laya.BlinnPhongMaterial(); mapMat.albedoColor = new Laya.Vector4(0.5, 0.5, 0.5, 1); mapMat.renderMode = Laya.BlinnPhongMaterial.RENDERMODE_OPAQUE; map.meshRenderer.material = mapMat; // 创建障碍物模型和材质 var obstacle = scene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createBox(1, 2, 1))); var obstacleMat = new Laya.BlinnPhongMaterial(); obstacleMat.albedoColor = new Laya.Vector4(0, 0.5, 0, 1); obstacleMat.renderMode = Laya.BlinnPhongMaterial.RENDERMODE_OPAQUE; obstacle.meshRenderer.material = obstacleMat; obstacle.transform.translate(new Laya.Vector3(-5, 0, 0)); // 创建迷雾层和材质 var fogLayer = scene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createPlane(50, 50))); var fogMat = new Laya.UnlitMaterial(); fogMat.albedoColor = new Laya.Vector4(0, 0, 0, 1); fogMat.renderMode = Laya.UnlitMaterial.RENDERMODE_TRANSPARENT; fogMat.renderQueue = Laya.Material.RENDERQUEUE_TRANSPARENT; fogLayer.meshRenderer.material = fogMat; fogLayer.transform.translate(new Laya.Vector3(0, 10, 0)); fogLayer.transform.rotate(new Laya.Vector3(90, 0, 0), true, false); // 创建渲染器 var renderer = Laya.stage.addChild(new Laya.Renderer()); renderer.render(scene, camera); // 更新迷雾层 Laya.timer.frameLoop(1, this, function() { var range = 5; // 迷雾范围 var pos = camera.transform.position; var fogPos = fogLayer.transform.position; fogPos.x = pos.x; fogPos.z = pos.z; fogMat.tilingOffset = new Laya.Vector4(range, range, -pos.x / range, -pos.z / range); }); ``` 在这个示例中,我们创建了一个简单的地图和障碍物,并使用BlinnPhongMaterial和UnlitMaterial给它们上色。然后创建了一个迷雾层,使用UnlitMaterial和透明渲染模式来遮挡地图和障碍物。在每帧更新时,根据相机的位置和迷雾范围,更新迷雾层的位置和纹理坐标,以实现迷雾效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值