(二)GL 简单绘制

1.前言

GL简介中已经对GL方法的使用做了详细的说明,此文则是对GL方法的一些简单应用实例。

2.绘制简单图形

基本参数变量如下所示:

    public int circleCount = 6;
    public int circleRadius = 3;
    public int triangleSize = 2;
    public int quadSize = 2;

2.1 绘制圆环

基于GL.LINES通过绘制线来生成圆。代码如下:

    private void DrawCircle()
    {
        float angleDelta = 2 * Mathf.PI / circleCount;

        GL.Begin(GL.LINES);
        GL.Color(Color.red);

        for (int i = 0; i < circleCount; i++)
        {
            float angle = angleDelta * i;
            float angleNext = angle + angleDelta;

            GL.Vertex3(Mathf.Cos(angle) * circleRadius, Mathf.Sin(angle) * circleRadius, 0);
            GL.Vertex3(Mathf.Cos(angleNext) * circleRadius, Mathf.Sin(angleNext) * circleRadius, 0);
        }

        GL.End();
    }

2.2 绘制三角形

绘制三角形平面

    private void DrawTriangle()
    {
        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.green);

        GL.Vertex3(-triangleSize, -triangleSize, 0);
        GL.Color(Color.black);
        GL.Vertex3(triangleSize, -triangleSize, 0);
        GL.Color(Color.red);
        GL.Vertex3(0, triangleSize, 0);

        GL.End();
    }

2.3 绘制四边形

绘制四边形平面

    private void DrawQuad()
    {
        GL.Begin(GL.QUADS);
        GL.Color(Color.blue);

        GL.Vertex3(-quadSize, -quadSize, 0);
        GL.Vertex3(quadSize, -quadSize, 0);
        GL.Vertex3(quadSize, quadSize, 0);
        GL.Vertex3(-quadSize, quadSize, 0);

        GL.End();
    }

2.4 绘制圆形面

在2.1中通过线绘制圆形环,此节通过三角形绘制圆面

   private void DrawCircleSurface()
    {
        float angleDelta = 2 * Mathf.PI / circleCount;

        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.yellow);

        for (int i = 0; i < circleCount; i++)
        {
            float angle = angleDelta * i;
            float angleNext = angle + angleDelta;

            GL.Vertex3(0, 0, 0);
            GL.Vertex3(Mathf.Cos(angle) * circleRadius, Mathf.Sin(angle) * circleRadius, 0);
            GL.Vertex3(Mathf.Cos(angleNext) * circleRadius, Mathf.Sin(angleNext) * circleRadius, 0);
        }

        GL.End();
    }

2.5 绘制立方体

通过Quad绘制立方体

    private void DrawCube()
    {
        GL.Begin(GL.QUADS);
        GL.Color(Color.white);

        GL.Vertex3(-quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, quadSize, -quadSize);
        GL.Vertex3(-quadSize, quadSize, -quadSize);

        GL.Vertex3(-quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, quadSize);

        GL.Vertex3(quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, quadSize, quadSize);
        GL.Vertex3(quadSize, quadSize, -quadSize);

        GL.Vertex3(-quadSize, -quadSize, -quadSize);
        GL.Vertex3(-quadSize, -quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, -quadSize);

        GL.Vertex3(-quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(-quadSize, -quadSize, quadSize);

        GL.Vertex3(-quadSize, quadSize, -quadSize);
        GL.Vertex3(quadSize, quadSize, -quadSize);
        GL.Vertex3(quadSize, quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, quadSize);

        GL.End();
    }

3.完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Graphics02GLDrawings : MonoBehaviour
{
    public enum DrawingType
    {
        DRAW_CIRCLE,
        DRAW_TRIANGLE,
        DRAW_QUAD,
        DRAW_CIRCLE_SURFACE,
        DRAW_CUBE
    }

    public DrawingType type = DrawingType.DRAW_CIRCLE;

    public int circleCount = 6;
    public int circleRadius = 3;
    public int triangleSize = 2;
    public int quadSize = 2;

    private Material glMat;

    private void SetMaterialPass()
    {
        if (glMat == null)
        {
            glMat = new Material(Shader.Find("Hidden/Internal-Colored"));
        }

        glMat.SetPass(0);
    }

    private void OnRenderObject()
    {
        SetMaterialPass();

        switch(type)
        {
            case DrawingType.DRAW_CIRCLE:
                DrawCircle();
                break;
            case DrawingType.DRAW_TRIANGLE:
                DrawTriangle();
                break;
            case DrawingType.DRAW_QUAD:
                DrawQuad();
                break;
            case DrawingType.DRAW_CIRCLE_SURFACE:
                DrawCircleSurface();
                break;
            case DrawingType.DRAW_CUBE:
                DrawCube();
                break;
        }
    }

    private void DrawCircle()
    {
        float angleDelta = 2 * Mathf.PI / circleCount;

        GL.Begin(GL.LINES);
        GL.Color(Color.red);

        for (int i = 0; i < circleCount; i++)
        {
            float angle = angleDelta * i;
            float angleNext = angle + angleDelta;

            GL.Vertex3(Mathf.Cos(angle) * circleRadius, Mathf.Sin(angle) * circleRadius, 0);
            GL.Vertex3(Mathf.Cos(angleNext) * circleRadius, Mathf.Sin(angleNext) * circleRadius, 0);
        }

        GL.End();
    }

    private void DrawTriangle()
    {
        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.green);

        GL.Vertex3(-triangleSize, -triangleSize, 0);
        GL.Color(Color.black);
        GL.Vertex3(triangleSize, -triangleSize, 0);
        GL.Color(Color.red);
        GL.Vertex3(0, triangleSize, 0);

        GL.End();
    }

    private void DrawQuad()
    {
        GL.Begin(GL.QUADS);
        GL.Color(Color.blue);

        GL.Vertex3(-quadSize, -quadSize, 0);
        GL.Vertex3(quadSize, -quadSize, 0);
        GL.Vertex3(quadSize, quadSize, 0);
        GL.Vertex3(-quadSize, quadSize, 0);

        GL.End();
    }

    private void DrawCircleSurface()
    {
        float angleDelta = 2 * Mathf.PI / circleCount;

        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.yellow);

        for (int i = 0; i < circleCount; i++)
        {
            float angle = angleDelta * i;
            float angleNext = angle + angleDelta;

            GL.Vertex3(0, 0, 0);
            GL.Vertex3(Mathf.Cos(angle) * circleRadius, Mathf.Sin(angle) * circleRadius, 0);
            GL.Vertex3(Mathf.Cos(angleNext) * circleRadius, Mathf.Sin(angleNext) * circleRadius, 0);
        }

        GL.End();
    }

    private void DrawCube()
    {
        GL.Begin(GL.QUADS);
        GL.Color(Color.white);

        GL.Vertex3(-quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, quadSize, -quadSize);
        GL.Vertex3(-quadSize, quadSize, -quadSize);

        GL.Vertex3(-quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, quadSize);

        GL.Vertex3(quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, quadSize, quadSize);
        GL.Vertex3(quadSize, quadSize, -quadSize);

        GL.Vertex3(-quadSize, -quadSize, -quadSize);
        GL.Vertex3(-quadSize, -quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, -quadSize);

        GL.Vertex3(-quadSize, -quadSize, -quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(quadSize, -quadSize, quadSize);
        GL.Vertex3(-quadSize, -quadSize, quadSize);

        GL.Vertex3(-quadSize, quadSize, -quadSize);
        GL.Vertex3(quadSize, quadSize, -quadSize);
        GL.Vertex3(quadSize, quadSize, quadSize);
        GL.Vertex3(-quadSize, quadSize, quadSize);

        GL.End();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将JavaScript API GL集成到Vue.js应用程序中的过程与将其集成到任何其他Web应用程序中的过程类似。下面是一个简单的步骤: 1. 在Vue.js应用程序中安装JavaScript API GL。可以使用npm或yarn进行安装。 2. 创建一个Vue.js组件,将JavaScript API GL集成到该组件中。可以将JavaScript API GL的绘图代码包含在Vue.js组件的生命周期挂载方法中。 3. 在Vue.js组件中设置JavaScript API GL的属性和事件处理程序。这些属性和事件处理程序可用于控制绘图和响应用户的交互行为。 以下是代码示例: ``` <template> <div ref="mapContainer" class="map-container"></div> </template> <script> import * as mapboxgl from 'mapbox-gl'; export default { data() { return { map: null } }, mounted() { // 初始化map mapboxgl.accessToken = 'your-access-token'; this.map = new mapboxgl.Map({ container: this.$refs.mapContainer, style: 'mapbox://styles/mapbox/streets-v11', center: [-96, 37.8], zoom: 3 }); } } </script> ``` 这是一个简单的Vue.js组件,用于在Web应用程序中集成JavaScript API GL。组件中包含一个div元素,它将用作地图容器。在组件的mounted生命周期钩子中,可以看到如何初始化地图并将其添加到div元素中。 在组件中,您还可以添加事件处理程序和其他属性来控制地图的行为,以及将地图数据与Vue.js应用程序的其他部分进行交互。 希望这可以帮助您开始在Vue.js应用程序中使用JavaScript API GL

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值