精华内容
下载资源
问答
  • 昨晚玩一个模拟经营的游戏,由于升级太慢我就不停的种树卖树来换取经验值。...类似在对应坐标点操作鼠标。原理非常简单,我就不贴代码了,主要说下如何控制鼠标点击事件。注册系统辅助权限,这里会触发用户授

    昨晚玩一个模拟经营的游戏,由于升级太慢我就不停的种树卖树来换取经验值。不过重复点击10几分钟后,实在受不了。网上本来准备找个鼠标自动点击的软件用用。结果没找到趁手的。如是自己写了个。

    自己设置需要点击的一组动作,长按(100,200),点击(576,789),点击(750,550)。类似在对应坐标点操作鼠标。

    原理非常简单,我就不贴代码了,主要说下如何控制鼠标点击事件。

    注册系统辅助权限,这里会触发用户授权

    let opts = NSDictionary(object: kCFBooleanTrue,
                            forKey: kAXTrustedCheckOptionPrompt.takeUnretainedValue() as NSString
                ) as CFDictionary
    
    guard AXIsProcessTrustedWithOptions(opts) == true else { return }

    鼠标事件

    // 鼠标左键按下
    let mouseDown = CGEvent(mouseEventSource: nil,
                            mouseType: .leftMouseDown,
                            mouseCursorPosition: CGPoint(x: 200, y: 300),
                            mouseButton: .left
    )
    mouseDown?.post(tap: .cghidEventTap)
    
    // 鼠标左键抬起
    let mouseUp = CGEvent(mouseEventSource: nil,
                          mouseType: .leftMouseUp,
                          mouseCursorPosition: CGPoint(x: 200, y: 300),
                          mouseButton: .left
    )
    mouseUp?.post(tap: .cghidEventTap)

    以上两个事件,组成了一个鼠标左键在坐标(200,300)点击事件

    MouseType支持类型

    /* Constants that specify the different types of input events. */
    public enum CGEventType : UInt32 {
    
    
        /* The null event. */
        case null
    
    
        /* Mouse events. */
        case leftMouseDown
    
        case leftMouseUp
    
        case rightMouseDown
    
        case rightMouseUp
    
        case mouseMoved
    
        case leftMouseDragged
    
        case rightMouseDragged
    
    
        /* Keyboard events. */
        case keyDown
    
        case keyUp
    
        case flagsChanged
    
    
        /* Specialized control devices. */
        case scrollWheel
    
        case tabletPointer
    
        case tabletProximity
    
        case otherMouseDown
    
        case otherMouseUp
    
        case otherMouseDragged
    
    
        /* Out of band event types. These are delivered to the event tap callback
           to notify it of unusual conditions that disable the event tap. */
        case tapDisabledByTimeout
    
        case tapDisabledByUserInput
    }

    长按事件

    有人可能会留意到上述没有长按事件

    长按事件就是 .leftMouseDown, 达到你需要长按的时间后,再触发.leftMouseUp

    扩展

    一般情况你做好一系列点击组合后,是用快捷键触发开始的。那么MacOS中如何监听系统快捷键呢或者键盘事件?

    添加系统键盘监听

    NSEvent.addGlobalMonitorForEvents(matching: .keyDown, handler: {
        [unowned self] event in
        // num1:18, num2:19
        if event.keyCode == 18 {
            // self.startAction()
        }
    })
    展开全文
  • 为了给WebGL基础系列文章画上一个圆满的句号,本文将会介绍如何应用之前讲的知识实现一些更加复杂且实用的功能,比如:鼠标控制物体旋转、选择立方体、选择立方体的某个面等?话不多说,下面开整??整?绘制圆点在之前...

    ?前言

    最近身体不适拖更了一段时间,十分抱歉!

    677257ae4273d8717cf13692ebe74223.png

    在之前的WebGL基础的系列文章中,我们学习了图形变换、坐标系统、变量内插过程、光照、GLSL ES基础语法等内容。为了给WebGL基础系列文章画上一个圆满的句号,本文将会介绍如何应用之前讲的知识实现一些更加复杂且实用的功能,比如:鼠标控制物体旋转、选择立方体、选择立方体的某个面等?

    话不多说,下面开整?

    ?整

    ?绘制圆点

    在之前绘制点的文章中,我们就知道了在屏幕上绘制的点是一个个方块,所以如果我们想要绘制一个圆点,那么就要像素描一样“切”去不必要的点?顶点着色器和片元着色器之间发生了光栅化过程,一个顶点被光栅化为了多个片元,每个片元都会经过片元着色器的处理。如果直接绘制,画出的点是方形的,可是如果在片元着色器中做一些改动的话,只绘制圆圈以内的片元,这样就可以绘制出圆形的点了(Excel是个无情的工具hhhh):

    455fcb9ed60e1e57bc570e9940568528.png

    为了将浅色部分的片元剔除掉,我们需要知道每个片元在光栅化过程中的坐标。当然GLSL ES也为我们提供了相应内置变量供我们使用:gl_FragCoordgl_PointCoordgl_FragCoord表示片元的窗口坐标,gl_PointCoord表示片元在被绘制的点内的坐标(范围为[0.0, 1.0])。我们在之前绘制蓝色点代码的片元着色器上做些改动:

    void main() {
      float dist = distance(gl_PointCoord, vec2(0.5, 0.5));
      if (dist     gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
      } else { discard; }
    }

    我们只处理并显示距离为0.5以内点(即点的半径为0.5),还记得discard语句吗?我们在GLSL ES语法基础一文的结束语中提到过?只需要做上面一些改动,我们就能在浏览器中看到一个圆形的点啦:

    4369f4429eebb98b08b6573865855591.png

    ?鼠标控制旋转立方体

    旋转物体实际上是根据当前鼠标的移动情况创建相应的旋转矩阵,并更新模型、视图以及投影矩阵。首先,我们在main()中定义一个变量保存当前物体旋转的角度:

    let currentAngle = [ 0.00.0 ];

    // 注册鼠标事件
    initEventHandlers( canvas, currentAngle );

    接下来,我们根据鼠标的移动计算出相应的旋转角度:

    function initEventHandlers ( canvas, currentAngle {
      let dragging = false;    // 当前是否在拖动
      let lastX = 0, lastY = 0;    //  鼠标的最后位置

      // 按下鼠标
      canvas.onmousedown = function ( ev {
        const x = ev.clientX, y = ev.clientY;
        // 如果鼠标在 canvas 内就开始拖动
        const rect = ev.target.getBoundingClientRect();
        if ( rect.left <= x && x       laxtX = x; lastY = y;
          dragging = true;
        }
      }

      // 松开鼠标
      canvas.onmouseup = function ( ev { dragging = false; }

      // 移动鼠标
      canvas.onmousemove = function ( ev {
        const x = ev.clientX, y = ev.clientY;
        if ( dragging ) {
          const factor = 100 / canvas.height;    // 旋转因子
          const dx = factor * ( x - lastX );
          const dy = factor * ( y - lastY );
          // 将 y 轴旋转角度控制在[90, -90]度
          currentAngle[ 0 ] = Math.max( Math.min( currentAngle[ 0 ] + dy, 90.0 ), -90.0 );
          currentAngle[ 1 ] = currentAngle[ 1 ] + dx;
        }
        lastX = x, lastY = y;
      }
    }

    最后,根据计算出的旋转角度更新相应矩阵的值:

    const g_FinalMatrix = new Matrix4();
    function draw ( gl, n, viewProjMatrix, u_FinalMatrix, currentAngle {
      g_FinalMatrix.set( viewProjMatrix );
      g_FinalMatrix.rotate( currentAngle[0], 1.00.00.0 );
      g_FinalMatrix.rotate( currentAngle[1], 0.01.00.0 );
      gl.uniformMatrix4fv( u_FinalMatrix, false, g_FinalMatrix.elements );

      gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
      gl.drawElements( gl.TRIANGLES, n, gl.UNSIGNED_BYTE, 0 );
    }

    最终效果如下图(为了旋转更加明显,我为立方体增加了纹理贴图):

    2e99d0af5bf1a9e487fdcd7c411ab7ca.gif

    ?选择物体

    使用过Maya/3D Max等软件的的小伙伴应该知道,在建模的时候我们可以选择某个模型,并且也可以选择模型的某一个面,从而进行拉伸等一系列操作。那么在WebGL中,假如你想选择一个物体,可以遵循以下步骤:

    1. 当鼠标按下时,将整个物体重绘成单一颜色;

    2. 读取鼠标点击处的像素颜色(比如设为红色);

    3. 使用立方体原来的颜色进行重绘;

    4. 如果步骤2读取到的颜色是红色,则做出相应提示。

    首先,修改一下顶点着色器(片元着色器无需改动):

    // ...
    uniform bool u_Clicked;

    void main () {
      gl_Position = u_FinalMatrix * a_Position;
      if (u_Clicked) {
        v_Color = vec4(1.0, 0.0, 0.0, 1.0);
      } else {
        v_Color = a_Color;
      }
    }

    然后,我们要获取到鼠标在canvas中点击的位置:

    function main ({
      // ...
      const u_Clicked = gl.getUniformLocation(gl.program, 'u_Clicked');
      gl.uniform1i(u_Clicked, 0);

      canvas.onmousedown = function( ev {
        let x = ev.clientX, y = ev.clientY;
        let rect = ev.target.getBoundingClientRect();
        if ( rect.left <= x && x       let x_in_canvas = x - rect.left, y_in_canvas = rect.bottom - y;
          let picked = check( gl, n, x_in_canvas, y_in_canvas, currentAngle, u_Clicked, viewProjMatrix, u_FinalMatrix );
          if ( picked ) alert('点击了立方体! ');
        }
    }

    check方法是用来检测鼠标是否点击到物体的,下面我们来实现check方法:

    function check ( gl, n, x, y, currentAngle, u_Clicked, viewProjMatrix, u_FinalMatrix {
      let picked = false;
      gl.uniform1i( u_Clicked, 1 );    // 将立方体置为红色
      draw( gl, n, currentAngle, viewProjMatrix, u_FinalMatrix );

      // 读取点击位置的像素颜色值
      const pixels = new Uint8Array4 );
      gl.readPixels( x, y, 11, gl.RGBA, gl.UNSIGNED_BYTE, pixels );

      // 如果 R 值为255,说明点击在了物体上
      if ( pixels[0] == 255 ) {
        picked = true;
      }

      gl.uniform1i(u_Clicked, 0);    // 将u_Clicked设为false,用原来的颜色重绘物体
      draw( gl, n, currentAngle, viewProjMatrix, u_FinalMatrix );

      return picked;
    }

    看一下最终效果:

    f02c3a2cc2fad82b4a12745e365c03b2.gif

    对于有多个物体的场景,这个简单的方法也适用,只需要为场景中每个物体都指定不同的颜色即可。通常来说,颜色缓冲区单个像素R、G、B、A每个分量都是8比特,也就是说,仅使用R分量就可以区分255个物体了。对于一些比较复杂的三维模型,我们可以采用简化的模型或缩小绘图区域的方法来达到目的。

    假如你理解了选择物体的的原理,那么选择立方体的某个表面对你来说就很简单了。以上面的立方体为例,我们需要为每个表面进行编号,当鼠标点击的时候就通过当前点击的像素区域获取到表面的编号,然后将相应表面置为白色以反馈用户。再次就不赘述实现过程了,直接贴出结果:

    e6f879111360ed08f8cf46273aa94a4e.gif

    ?雾化

    雾化通俗点来说就是离得远的东西看起来更模糊一些,这也是现实生活中很常见的一种现象。那么该如何实现雾化这一效果呢?我们以线性雾化为例,在线性雾化中,某一点的雾化程度取决于它与视点之间的距离,距离越远雾化程度越高。线性雾化有起点和终点,起点表示雾化开始之处,终点表示完全雾化之处,两点之间某一点的雾化程度与该点与视点的距离呈线性关系。某一点的雾化程度可以被定义为雾化因子,并在线性雾化公式中被计算出来:81626df797fe43a5378c6fc8aaed2d4d.png
    同时:0a2c6f122e1e20f2ce4df2f3d91a7c33.png
    如果雾化因子为1.0,则表示该点完全没有被雾化,可以很清晰地看到此处的物体;如果雾化因子为0.0,则表示该点已被完全雾化,此处的物体不可见。

    796be751a70dd7dfc7133c830bf503d0.png

    在片元着色器中,根据雾化因子计算片元颜色公式如下:159f5f719e40d3152da9c772cf4de94b.png
    首先,我们根据上述公式修改一下顶点着色器和片元着色器:

    /* 顶点着色器 */

    // ...
    uniform mat4 u_ModelMatrix;
    uniform vec4 u_Eye;
    varying float v_Dist;

    void main () {
      // ...
      v_Dist = distance(u_ModelMatrix * a_Position, u_Eye);
    }

    /* 片元着色器 */

    // ...
    uniform vec3 u_FogColor;
    uniform vec2 u_FogDist;
    varying float v_Dist;

    void main () {
      float fogFactor = clamp((u_FogDist.y - v_Dist) / (u_FogDist.y - u_FogDist.x), 0.0, 1.0);
      vec3 color = mix(u_FogColor, vec3(v_Color), fogFactor);
      gl_FragColor = vec4(color, v_Color.a);
    }

    接下来我们在JavaScript中传入着色器需要的值:

    function main ({
      // ...

      // 雾的颜色
      const fogColor = new Float32Array([0.1370.2310.423]);
      // 雾化的起点和终点
      const fogDist = new Float32Array([5580]);
      // 视点在世界坐标系下的位置
      const eye = new Float32Array([2565351.0]);

      gl.uniform3fv(u_FogColor, fogColor);
      gl.uniform2fv(u_FogDist, fogDist);
      gl.uniform4fv(u_Eye, eye);

      // ...

      // 设置背景色并开启消除隐藏面功能
      gl.clearColor(fogColor[0], fogColor[1], fogColor[2], 1.0); // Color of Fog
      gl.enable(gl.DEPTH_TEST);

      // ...
      finalMatrix.lookAt(eye[0], eye[1], eye[2], 020010);
      // ...
    }

    为了方便大家观察效果,我为程序添加了一些交互,通过按键盘上的上/下键可以修改雾化的终点值:

    7ea8445e6adb7d163aa1a9004c323b9b.gif

    ?结束语

    WebGL基础系列文章就告一段落了,接下来准备看刚入手的《计算机图形学导论》,届时也会把自己的学习心得分享给大家?后续还打算出《ThreeJS 源码剖析》系列来记录自己学习ThreeJs的点点滴滴?

    展开全文
  • //分页获取消火栓列表的坐标点 var points = ""; $.ajax({ type: "POST",//方法类型 async: false,//默认是true dataType: 'json', contentType:"application/json", ...
    	 //分页获取消火栓列表的坐标点
          var points = "";
            $.ajax({
                type: "POST",//方法类型
                async: false,//默认是true
                dataType: 'json',
                contentType:"application/json",
                data: JSON.stringify(rows),
                url: ctx + 'platform/feFireWater/bangFireListLonLat',
                success: function (result) {
                    points = result.data;
                    console.log(points);
                }
            });
    
    	//接收json串
      	@PostMapping("/bangFireListLonLat")
        @ResponseBody
        public AjaxResult bangFireList(@RequestBody List<Map<String, Object>> rows) {
            System.out.println(rows);
            return AjaxResult.success(rows);
        }
    

    打印的rows的数据

    在这里插入图片描述
    前台传json数据可以用 实体类接收,实体类按照json格式封装。也可以直接接收json串(如上)。

    展开全文
  • 我想要的是,在XYPlot上,鼠标的坐标显示为鼠标附近的提示,当(鼠标)仅在图表上...到目前为止,我可以使用ChartMouseListener和chartMouseMoved方法获取坐标并打印在控制台上.这是我的项目以及我希望如何成为鼠标图表....

    我想要的是,在XYPlot上,鼠标的坐标显示为鼠标附近的提示,当(鼠标)仅在图表上移动时!

    换句话说,当十字准线移动到另一个点时,坐标值的定位也会在十字准线之后移动.

    此外,还将绘制1条水平线和1条垂直线,它们专门与鼠标所在的点相交.

    这可能吗?

    到目前为止,我可以使用ChartMouseListener和chartMouseMoved方法获取坐标并打印在控制台上.

    这是我的项目以及我希望如何成为鼠标图表..

    解决方法:

    JFreeChart对十字准线提供了非常灵活的支持.要执行您所描述的操作,我将在ChartPanel上使用Overlay,并从ChartMouseListener更新十字准线.这是一个自包含的示例(我将添加到我们随JFreeChart Developer Guide一起提供的演示集合中):

    package org.jfree.chart.demo;

    import java.awt.BasicStroke;

    import java.awt.Color;

    import java.awt.geom.Rectangle2D;

    import javax.swing.JFrame;

    import javax.swing.JPanel;

    import javax.swing.SwingUtilities;

    import org.jfree.chart.ChartFactory;

    import org.jfree.chart.ChartMouseEvent;

    import org.jfree.chart.ChartMouseListener;

    import org.jfree.chart.ChartPanel;

    import org.jfree.chart.JFreeChart;

    import org.jfree.chart.axis.ValueAxis;

    import org.jfree.chart.panel.CrosshairOverlay;

    import org.jfree.chart.plot.Crosshair;

    import org.jfree.chart.plot.XYPlot;

    import org.jfree.data.general.DatasetUtilities;

    import org.jfree.data.xy.XYDataset;

    import org.jfree.data.xy.XYSeries;

    import org.jfree.data.xy.XYSeriesCollection;

    import org.jfree.ui.RectangleEdge;

    /**

    * A demo showing crosshairs that follow the data points on an XYPlot.

    */

    public class CrosshairOverlayDemo1 extends JFrame implements ChartMouseListener {

    private ChartPanel chartPanel;

    private Crosshair xCrosshair;

    private Crosshair yCrosshair;

    public CrosshairOverlayDemo1(String title) {

    super(title);

    setContentPane(createContent());

    }

    private JPanel createContent() {

    JFreeChart chart = createChart(createDataset());

    this.chartPanel = new ChartPanel(chart);

    this.chartPanel.addChartMouseListener(this);

    CrosshairOverlay crosshairOverlay = new CrosshairOverlay();

    this.xCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f));

    this.xCrosshair.setLabelVisible(true);

    this.yCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f));

    this.yCrosshair.setLabelVisible(true);

    crosshairOverlay.addDomainCrosshair(xCrosshair);

    crosshairOverlay.addRangeCrosshair(yCrosshair);

    chartPanel.addOverlay(crosshairOverlay);

    return chartPanel;

    }

    private JFreeChart createChart(XYDataset dataset) {

    JFreeChart chart = ChartFactory.createXYLineChart("Crosshair Demo",

    "X", "Y", dataset);

    return chart;

    }

    private XYDataset createDataset() {

    XYSeries series = new XYSeries("S1");

    for (int x = 0; x < 10; x++) {

    series.add(x, x + Math.random() * 4.0);

    }

    XYSeriesCollection dataset = new XYSeriesCollection(series);

    return dataset;

    }

    @Override

    public void chartMouseClicked(ChartMouseEvent event) {

    // ignore

    }

    @Override

    public void chartMouseMoved(ChartMouseEvent event) {

    Rectangle2D dataArea = this.chartPanel.getScreenDataArea();

    JFreeChart chart = event.getChart();

    XYPlot plot = (XYPlot) chart.getPlot();

    ValueAxis xAxis = plot.getDomainAxis();

    double x = xAxis.java2DToValue(event.getTrigger().getX(), dataArea,

    RectangleEdge.BOTTOM);

    double y = DatasetUtilities.findYValue(plot.getDataset(), 0, x);

    this.xCrosshair.setValue(x);

    this.yCrosshair.setValue(y);

    }

    public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {

    @Override

    public void run() {

    CrosshairOverlayDemo1 app = new CrosshairOverlayDemo1(

    "JFreeChart: CrosshairOverlayDemo1.java");

    app.pack();

    app.setVisible(true);

    }

    });

    }

    }

    标签:java,jfreechart,mouse,coordinates

    来源: https://codeday.me/bug/20190925/1816605.html

    展开全文
  • 获取spline控制点的distance有个问题是,当spline很长时,这个方法不太准确。那就不要让一条spline太长了。(20210116:依然没有找到很好的,获取spline距离的方法。如何通过任意点的世界坐标,找到它在某条spline...
  • 实现图像的标注和切割,关键不是切割图像,而是如何标注多边形区域,获取标注点信息。为此我为Airglass新增了创建多边形的Polygon类。 拖拽多边形 和矩形或圆形不同的是,多边形的中心点坐标位置和多边形的边界是...
  • 如何获取屏幕上某的颜色 位图文件的结构是怎样的 如何通过位图文件直接得到位图的大小 如何通过位图文件显示位图 如何将DIB位图写入位图文件 BitBlt和StretchBlt函数有什么区别 什么是掩码位图以及如何创建 如何...
  • 通过Input.mousePosition,获取当前的X、Y坐标,然后分别处以Screen.width与Screen.height,算出当前屏幕位置的百分比,接着用百分比乘以最大旋转幅度。 接下来就是一些功能补充,添加一个子弹预制件,点击的时候...
  • 整理一点资料做定高控制时,不可避免的就要涉及到如何解算出高度信息,那高度信息又是如何获取的?参考pixhawk源码。这里只介绍只有气压计和加速度计的情况。概述:首先要明白,所需的高度信息是地理坐标系下的相对...
  • VC++ 编程技巧

    2010-02-16 14:24:48
    1. 如何获取应用程序的实例句柄? 1 2. 如何通过代码获得应用程序主窗口的指针? 1 3.如何在程序中获得其他程序的图标? 1 4.如何编程结束应用程序?如何编程控制windows的重新引导? 1 5.怎样加载其他的应用程序? 2 6. ...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    115 <br>0192 如何获取“我的文档”系统文件夹路径 115 <br>0193 如何获取应用程序当前执行的路径 116 <br>0194 如何获取当前操作系统的信息 116 <br>0195 如何实现基本数据类型随意转换 116...
  • 1. 如何获取应用程序的实例句柄? 2. 如何通过代码获得应用程序主窗口的指针? 3.如何在程序中获得其他程序的图标? 4.如何编程结束应用程序?如何编程控制windows的重新引导? 5.怎样加载其他的应用程序? 6. 确定应用...
  • C#开发经验技巧宝典

    2008-10-14 20:07:26
    0343 如何获取DataGridView控件中的当前单元格 191 0344 如何禁止DataGridView控件中添加和删除行 191 0345 DataGridView控件选中单元格时整个行背景变色 191 0346 如何复制DataGridView控件单元格中的数据 ...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0211 如何获取DataGrid单元格中的内容 140 0212 如何锁定文本框中的文本 141 0213 如何设置光标到文本框的末尾 141 0214 如何改变表格列的矩形区域颜色 142 0215 控制在文本框中只能输入两位小数 143 0216...
  • 0211 如何获取DataGrid单元格中的内容 140 0212 如何锁定文本框中的文本 141 0213 如何设置光标到文本框的末尾 141 0214 如何改变表格列的矩形区域颜色 142 0215 控制在文本框中只能输入两位小数 143 0216...
  • 0211 如何获取DataGrid单元格中的内容 140 0212 如何锁定文本框中的文本 141 0213 如何设置光标到文本框的末尾 141 0214 如何改变表格列的矩形区域颜色 142 0215 控制在文本框中只能输入两位小数 143 0216...
  • 0211 如何获取DataGrid单元格中的内容 140 0212 如何锁定文本框中的文本 141 0213 如何设置光标到文本框的末尾 141 0214 如何改变表格列的矩形区域颜色 142 0215 控制在文本框中只能输入两位小数 143 0216...
  • 0211 如何获取DataGrid单元格中的内容 140 0212 如何锁定文本框中的文本 141 0213 如何设置光标到文本框的末尾 141 0214 如何改变表格列的矩形区域颜色 142 0215 控制在文本框中只能输入两位小数 143 0216...
  • 0211 如何获取DataGrid单元格中的内容 140 0212 如何锁定文本框中的文本 141 0213 如何设置光标到文本框的末尾 141 0214 如何改变表格列的矩形区域颜色 142 0215 控制在文本框中只能输入两位小数 143 0216...
  • 运动中的圆环,是不断的随机更改控制点坐标,并为起始点添加偏移量的结果,这是一个不断调试的过程…,需要不断调整控制点来控制凸起的幅度,很难找到一个完美的效果。 嵌套滑动 这是当前阶段的效果,后续...
  • 地形模型一般是由NxN的网格构成,网格的在y轴上的坐标由灰度地形图上相应的颜色决定。颜色越亮,高度越高。颜色每个通道的取值范围可以是0~ 255,通过公式转换,可以很容易的控制生成模型的高度。 生成网格顶点...
  • WebGL编程指南

    2018-11-26 18:04:36
    50 用示例程序做实验 53 改变的颜色 55 示例程序(ColoredPoints.js) 56 uniform 变量 58 获取uniform 变量的存储地址 59 向uniform 变量赋值 60 gl.uniform4f() 的同族函数 61 总结 62 第3 章 绘制和变换三角形 ...
  • 如何实现圆形的 364 示例程序(RoundedPoint.js) 366 α 混合 367 如何实现α 混合 367 示例程序(LookAtBlendedTriangles.js) 369 混合函数 369 半透明的三维物体(BlendedCube.js) 371 透明与不透明...
  • WebGL编程指南.rar

    热门讨论 2015-04-09 12:16:56
    如何实现圆形的 364 示例程序(RoundedPoint.js) 366 α 混合 367 如何实现α 混合 367 示例程序(LookAtBlendedTriangles.js) 369 混合函数 369 半透明的三维物体(BlendedCube.js) 371 透明与不透明...
  • WEBGL编程指南pdf

    热门讨论 2015-09-17 14:34:13
    如何实现圆形的 364 示例程序(RoundedPoint.js) 366 α 混合 367 如何实现α 混合 367 示例程序(LookAtBlendedTriangles.js) 369 混合函数 369 半透明的三维物体(BlendedCube.js) 371 透明与不透明...
  • WebGL编程指南压缩包

    2015-05-15 11:44:05
    如何实现圆形的 364 示例程序(RoundedPoint.js) 366 α 混合 367 如何实现α 混合 367 示例程序(LookAtBlendedTriangles.js) 369 混合函数 369 半透明的三维物体(BlendedCube.js) 371 透明与不透明...
  • 如何实现圆形的 364 示例程序(RoundedPoint.js) 366 α 混合 367 如何实现α 混合 367 示例程序(LookAtBlendedTriangles.js) 369 混合函数 369 半透明的三维物体(BlendedCube.js) 371 透明与不透明...
  • 如何实现圆形的 364 示例程序(RoundedPoint.js) 366 α 混合 367 如何实现α 混合 367 示例程序(LookAtBlendedTriangles.js) 369 混合函数 369 半透明的三维物体(BlendedCube.js) 371 透明与不透明...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 153
精华内容 61
关键字:

如何获取控制点坐标