javascript - 如何在 Canvas 上使用 javascript 为圆锥体或圆柱体提供 3d 效果?以及如何在其中填充所需的颜色?

标签 javascript html

我正在做一个 BE 最后一年的项目,所以我需要你的帮助。 如何在 Canvas 上使用 javascript 为圆锥体或圆柱体提供 3d 效果?以及如何在其中填充所需的颜色,以便即使对象被旋转、移位或缩放也能保持相同的 3D 效果?

最佳答案

可以使用 4 档​​梯度模拟圆柱体的 3D 效果。

例如,如果你想要一个红色的圆柱体,你可以这样做:

  • 红色
  • 淡红色
  • 红色
  • 深红色
  • 红色

人们可能会稍微调整这些比率,但上面列出的内容会给您带来预期的效果。显然,梯度的方向必须垂直于圆柱体的长度。

您可以使用 xColor JS 库之类的东西来获得更亮和更暗的颜色。

所以你会有这样的东西:

function draw() {
  var ctx = document.getElementById('canvas').getContext('2d');

  var x1 = 0, x2 = 20, y1 = 0, y2 = 100;

  var lingrad = ctx.createLinearGradient(x1,y1,x2,y1);
  lingrad.addColorStop(0, 'red');
  lingrad.addColorStop(0.25, $.xcolor.lighten('red', 1));
  lingrad.addColorStop(0.5, 'red');
  lingrad.addColorStop(0.75, $.xcolor.darken('red', 1));
  lingrad.addColorStop(1, 'red');

  ctx.fillStyle = lingrad;   
  ctx.fillRect(x1,y1,x2-x1,y2-y1);
}

我很确定轮换适用于所有内容,因此除了一个警告外,您不必担心这一点。这种错觉依赖于我们倾向于期望物体从上方被照亮的想法(可能是天空中那个大火球)。因此,一旦旋转超出垂直方向,您可能需要反转渐变。虽然效果可能很刺耳。

试一试。

更新:这是为了演示 - 希望对您有所帮助

var context = document.getElementById('canvas').getContext('2d');

var cylinder = {width: 30, height: 100};

var x = -cylinder.width / 2;
var y = -cylinder.height / 2;
var baseColor = "#c00";

var tick = 0;

function draw() {
    context.clearRect(0, 0, context.canvas.width, context.canvas.height);

    context.save();

    context.translate(context.canvas.width / 2, context.canvas.height / 2);

    var gradient = context.createLinearGradient(x, y, x + cylinder.width, y);
    gradient.addColorStop(0, baseColor);
    gradient.addColorStop(0.25, $.xcolor.lighten(baseColor, 1));
    gradient.addColorStop(0.5, baseColor);
    gradient.addColorStop(0.75, $.xcolor.darken(baseColor, 0.5));
    gradient.addColorStop(1, baseColor);

    context.rotate(tick++ / 180 * Math.PI);

    context.fillStyle = gradient;
    context.fillRect(x, y, cylinder.width, cylinder.height);

    context.restore();

    console.log("Tick");
}

setInterval(draw, 1000 / 20);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://rawgithub.com/infusion/jQuery-xcolor/master/jquery.xcolor.min.js"></script>
<!DOCTYPE html>
<html>
<head>
    <title>Cylinder effect</title>
    <script src="/javascripts/jquery-1.5.1.js"></script>
    <script src="/javascripts/jquery.xcolor.js"></script>
</head>
<body>
<div style="margin-left:auto;margin-right:auto;margin-top: 100px;width:640px;height:480px;border:1px solid gray">
    <canvas id="canvas" width="640" height="480"></canvas>
</div>


</body>
</html>

关于javascript - 如何在 Canvas 上使用 javascript 为圆锥体或圆柱体提供 3d 效果?以及如何在其中填充所需的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5362047/

相关文章:

javascript - 在文档中添加新元素后,jQuery 显示不起作用

html - 是否可以使用仅 CSS 的容器包装器?

javascript - 更改下拉菜单中选定的选项,从而引发 onchange 事件; javascript

javascript - 确认回发 OnClientClick 按钮 ASP.NET

php - 我一直收到这个 : Integrity constraint violation while trying to verify if email exists in database

javascript - 正则表达式在 HTML 中查找价格

php - 向 php html 电子邮件添加样式

javascript - jQuery:我如何循环遍历一组元素,只找到那些与另一个数组中的值匹配的元素?

javascript - 如何将图标附加到光标?

javascript - NodeJS 请求和错误处理