首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我如何使我的笑脸(用Windows窗体制作)是相对的,这意味着给它一个不同的(x,y)坐标,它将保持不变?

要实现笑脸在窗体中相对不变的效果,可以使用Windows窗体的绘图功能来绘制笑脸,并通过设置笑脸的位置坐标来实现相对不变的效果。

首先,需要创建一个Windows窗体应用程序,并在窗体上添加绘图的功能。可以使用C#语言进行开发,使用.NET Framework提供的System.Drawing命名空间中的相关类来实现绘图功能。

在窗体的绘图事件中,可以使用Graphics对象来绘制笑脸。可以通过绘制圆形、椭圆、弧线等基本图形来构建笑脸的各个部分,如圆形作为脸部,弧线作为嘴巴,圆形作为眼睛等。可以使用Pen对象设置绘图的颜色、线条粗细等属性,使用Brush对象设置填充的颜色。

在绘制笑脸时,可以通过设置笑脸的位置坐标来实现相对不变的效果。可以定义一个变量来保存笑脸的位置坐标,然后在绘图事件中根据该变量的值来确定笑脸的位置。可以通过修改该变量的值来改变笑脸的位置,从而实现笑脸相对不变的效果。

以下是一个简单的示例代码,演示如何在Windows窗体中绘制相对不变的笑脸:

代码语言:txt
复制
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        private int smileyX = 100; // 笑脸的初始X坐标
        private int smileyY = 100; // 笑脸的初始Y坐标

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            // 绘制笑脸
            Pen pen = new Pen(Color.Black);
            Brush brush = new SolidBrush(Color.Yellow);

            // 绘制脸部
            g.FillEllipse(brush, smileyX, smileyY, 100, 100);

            // 绘制嘴巴
            g.DrawArc(pen, smileyX + 20, smileyY + 30, 60, 40, 225, 90);

            // 绘制左眼
            g.FillEllipse(brush, smileyX + 25, smileyY + 20, 20, 20);

            // 绘制右眼
            g.FillEllipse(brush, smileyX + 55, smileyY + 20, 20, 20);
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            // 修改笑脸的位置坐标
            smileyX = e.X;
            smileyY = e.Y;

            // 重新绘制窗体
            Invalidate();
        }
    }
}

在上述示例代码中,笑脸的初始位置坐标为(100, 100),笑脸的位置随鼠标移动而改变。当鼠标在窗体上移动时,会触发窗体的MouseMove事件,通过修改笑脸的位置坐标并重新绘制窗体,实现笑脸相对不变的效果。

这只是一个简单的示例,实际应用中可以根据需求进行更复杂的绘图和交互操作。关于Windows窗体的绘图和事件处理,可以参考微软官方文档或其他相关教程进行深入学习。

注意:以上示例代码中没有提及腾讯云相关产品和产品介绍链接地址,因为腾讯云并没有直接与Windows窗体制作笑脸相关的产品或服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

基础渲染系列(一)图形学的基石——矩阵

移动,旋转和缩放网格是通过操纵其顶点的位置来完成的。这属于空间上的变换,因此要在实际中看到它,我们必须使空间可见。可以通过创建用“点”组成的3D网格来实现。点可以是任何预制件。 ?...这意味着每次调用都会创建一个新数组,在本例中是每次Update。 替代版本具有列表参数。 这样做的好处是它将把组件放到列表中,而不是创建一个新的数组。...如果我们一次对所有三个维度都使用此技巧,那么最终将得到一个矩阵,其对角线为1,其他任何地方为0。 这被称为单位矩阵,因为它不会改变与之相乘的关系。 它就像一个过滤器,使所有内容保持不变。 ?...3.3 为X和Y做矩阵旋转 使用我们找到的绕Z轴旋转的相同方式,我们可以得出绕Y轴旋转的矩阵。首先,X轴从 ? 开始,逆时针旋转90°后,变为 ? 。 这意味着旋转的X轴可以用 ? 来表示。...Y轴保持不变,从而完成了旋转矩阵。 ? 最后旋转矩阵使X保持不变,并以类似方式调整Y和Z。 ? 3.4 统一旋转矩阵 我们的三个旋转矩阵每个绕单个轴旋转。

5K23

Unity基础教程系列(新)(二)——构建视图(Visualizing Math)

更改位置的工作方式相同,不同之处在于,我们需要为localPosition属性分配3D向量。 使用Vector3结构类型创建3D向量。例如,将点的X坐标设置为1,将其Y和Z坐标保持为零。...这意味着你可以编写类似y =(x + = 3)的内容。这会使x增加3,并将其结果也分配给y。这意味着我们也可以在while表达式内增加i,从而缩短代码块。 ?...现在Y坐标总是0,表示一个函数f(x)=0。为了显示一个不同的函数,我们需要确定循环内部的Y坐标,而不是在它之前。首先让Y = X,表示函数f(X)= X。 ? ?...由于每个立方体将获得不同的颜色,这意味着我们最终将为每个对象获得一个唯一的材质实例。而且,当以后为视图制作动画时,我们也需要一直调整这些材质。尽管此方法有效,但效率不是很高。...如果localPosition是一个公共字段,那么我们可以直接设置该点位置的Y坐标。但是,localPosition是一个属性。它会将向量值的副本传递给我们,或复制我们分配给它的值。

2.6K50
  • 使用 SVG 和 Vue.Js 构建动态树图

    我们将首先学习如何制作三次贝塞尔曲线,然后通过剪切蒙版在坐标系中尝试找到 元素可用的 x 和 y 点。 我在这个案例中使用了很多视觉动画以保证趣味性。...小 c 表示相对值,而大写 C 表示绝对值。我用绝对值 C 来创建这个图。 实现对称性 对称性是实现该图的关键点。为了实现这一点,我只使用一个变量来派生出类似于高度,宽度和中点等值。...现在整张图的用户空间 / 坐标系已准备好,让我们看看 size 变量如何通过使用不同的 % 值来帮助计算坐标。 恒定和动态坐标 ? 圆是图的一部分。这就是为什么从一开始就把它包含在计算中是很重要的。...圆的 radius 属性设置为 topHeight 的一半,这样的可用空间非常合适。 现在,让我们看一下路径坐标…… x0,y0 —— 第一对锚点始终保持不变。...= (50%的size,20%的size+radius) x1,y1 —— 贝塞尔控制点 1,对于所有路径也保持不变。考虑到对称性, x1 和 y1 总是图表 size 的一半。

    6.5K50

    基础渲染系列(六)——凹凸

    要将其变成指向上的法向矢量,我们必须将切线绕Z轴旋转90°。 ? ? (使用实际的法线) 矢量旋转如何工作的? 通过交换向量的X和Y分量,并翻转新的X分量的符号,可以将2D向量逆时针旋转90°。...在视觉上,生成的矢量的绝对大小与你可以使用两个矢量制作的平行四边形的表面积相对应。 ? (叉乘) 注意 A×B = -B×A。这意味着结果的方向取决于向量的顺序。...另一个原因是RGB通道获得一个查找表,而A获得其自己的查找表。这样可以使X和Y分量保持隔离。 压缩是有损的,但对于法线贴图是可以接受的。与未压缩的8位RGB纹理相比,你获得了3:1的压缩率。...s是任意比例因子。Z分量等于该因子。这意味着我们可以通过将X和Y除以Z来找到偏导数。这仅在Z为零(与垂直表面相对应)时失败。我们的凹凸远没有那么陡峭,所以不必为此担心。...这给了我们向量 ? 然后降低X和Y的缩放比例,得到 ? 这种调整会夸大X和Y分量,从而沿陡峭的坡度产生更明显的凸起。但是,当一个法线平坦时,另一个法线不会改变。 为什么称为泛白混合?

    3.8K40

    使用C#开发屏幕保护程序步骤建议收藏

    大家好,又见面了,我是全栈君 本文介绍使用C#制作屏幕保护的方法,这个屏幕保护就是仿效视窗系统自带的字幕屏保。   屏幕保护程序的扩展名虽然是”scr”,但其实是一个可执行的”exe”文件。...但他又是一个比较独特的”exe”文件。下面就来探讨一下,用C#是如何编写屏幕保护 的整个过程。   ...,是通过一个定时器来完成的。...在 程序中,判断鼠标是否移动的思路是通过二个全局变量记录下,程序刚刚运行的时候的鼠标的位置(即:X和Y),当鼠标移动的时候,判断移动后的位置和记录的 位置是否有出入,如果有出入,就关闭屏保。...(4).对Windows对屏幕保护设定参数的响应:   当屏幕保护加入到Windows系统后,你就可以通过Windows系统来设定屏幕保护的属性了,由于我们制作的这个屏幕保护,没有可供设置的选项,但也要对

    1.4K10

    手把手教你使用PyTorch从零实现YOLOv3(1)

    但是,实际上,由于各种问题,我们可能希望保持不变的输入大小,而这些问题只会在实现算法时浮出水面。...YOLO方程 bx,by,bw,bh是我们预测的x,y中心坐标,宽度和高度。tx,ty,tw,th是网络输出的内容。cx和cy是网格的左上角坐标。pw和ph是盒子的锚点尺寸。...但是,等等,如果预测的x,y坐标大于1,例如(1.2,0.7),会发生什么。这意味着中心位于(7.2,6.7)。请注意,中心现在位于红色单元格或第7行的第8个单元格的正上方。...原因是Softmaxing类分数假定这些类是互斥的。用简单的话说,如果一个对象属于一个类,那么可以保证它不能属于另一个类。这对于我们将基于检测器的COCO数据库是正确的。...该检测层用于在三个不同大小的特征图上进行检测,分别具有步幅32、16、8。这意味着,使用416 x 416的输入,我们将以13 x 13、26 x 26和52 x 52的比例进行检测。

    3.6K11

    Unity Demo教程系列——Unity塔防游戏(四)弹道(Lobbing Explosives)

    它增加了迫击炮塔,发射的炮弹会在撞击时爆炸。 本教程是CatLikeCoding系列的一部分,原文地址见文章底部。 本教程是用Unity 2018.4.4f1制作的。 ?...塔底的下面的点是[0,y],目标点是[x,y],当x是3,并且y为负的垂直位置是炮塔的着陆点。 我们需要跟踪这两个值。 ? ? (目标三角形) 通常目标可以在射程内的任何位置,所以Z维也起作用。...但是,目标三角形仍然是2D的,它只是绕着Y轴旋转。为了说明这一点,我们将添加一个相对偏移向量参数,用四个XZ偏移量启动和调用它:[3,0],[0,1],[1,1],和[3,1]。...目标点等于发射点加上它的偏移量,然后它的Y坐标被设为零。 ? 现在目标三角形的x等于从塔底指向目标点的2D向量的长度。将这个向量归一化也会得到一个XZ方向向量我们可以用它来对齐三角形。...在最大射程,r=0所以对于tanθ来说,只有一个解,这是一个低轨迹。这意味着我们知道了所需的发射速度 ? s是如何进行推导的? ?

    2.4K10

    【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去

    ,例如输入一些东西、点选一个item之类的,可能像这样: 完了返回原窗体并获取刚刚的输入,这样做并没有什么问题,但在几天前我突然产生了一些想法:为什么非得有板有眼的弹出一个窗体给用户呢,是不是可以在按钮附近迅速呈现一个层来做这些事呢...不过受该方案的启发,我想到用ContextMenu来做容器(注意这个菜单类跟上面提到的继承自ToolStripDropDown的ContextMenuStrip大大的不同,前者是OS原生的菜单,就是在桌面...我还是打回.net的主意,当中仍然是做了许多不同的尝试,Form、Panel、UserControl、ContainerControl、Control等等看起来适合做容器层的东西都试了个遍,甚至重新在ToolStripDropDown...上打主意,最后选用Form,改造一番,自我感觉较理想的实现了我要的东西:一个叫做FloatLayerBase的基类,它本身继承自System.Windows.Forms.Form类,而需要作为浮动层显示的应用则继承自...最后无论是Show还是ShowDialog弹出来的浮动层,都可以像右键菜单那样通过在其它地方点鼠标使之消失,这里需要说明一下: 鼠标只会点在本程序内的窗体中时,让浮动层消失。

    2.8K20

    Unity基础教程-物体运动(十一)——滚动(Animated Sphere)

    它把我们毫无特色的球变成了滚动的球。 本教程是CatLikeCoding系列的一部分,原文地址见文章底部。 本教程是用Unity 2019.4.8f1制作的。它还使用了ProBuilder包。...(在游玩区四处滚动) 1 依赖于速度的加速度 我们当前的加速方法是相对于玩家的输入空间的,我们使用世界空间或轨道摄像机。这可以正常工作,但是在应用加速度时它将忽略球体的当前速度。...(滚动和旋转) 这意味着我们需要知道球的半径,该半径取决于球体的大小。让我们为其添加一个配置选项,该选项必须为正,默认设置为0.5,与默认球体匹配。 ? ?...给它两个参数,第一个是旋转轴,第二个是球的旋转。用球的局部上轴替换重力路线,并用旋转轴替换重力。最后,将调整应用于球的旋转并将其返回。 ? 如果对齐速度为正,则在UpdateBall中调用该方法。...(沿墙滚动) 3.2 忽略向上的运动 当前,我们使用所有三个维度的运动来确定球的旋转和对齐方式。这意味着相对的向上和向下运动会对其产生影响。

    3.3K30

    Unity基础系列(三)——数学表面(数字雕刻)

    然后设置位置的Z坐标,就像它的X坐标,用z代替x。 ? 现在创建出来的是一个由点组成的正方形网格,而不是一条单独的线了。因为函数仍然只依赖于X维,它看起来就像是原来的点被挤压成线。 ?...我用Z做外循环,用X做内循环。结果会和前面的保持一致。这意味着网格是通过沿X方向创建点行来构造的,而行是沿Z偏移的。你也可以反过来使用X作为外部循环,Z作为内循环。...如果两个点有相同的X和Z坐标,那它就不能再拥有相同的Y坐标了,这是2D的局限,意味着表面的曲率是有限定的。它们的边不能垂直,也不能向后折叠。要避免这点,现在,函数不仅要输出Y,还要输出X和Z。...用一个简单的循环来初始化所有的点并保持它们的位置不变。 ? 3.2 创建圆柱体 为了证明示例不再局限于每个(X,Z)坐标的一个点,添加一个 Cylinder函数方法来创建一个定义圆柱的功能。...如果要看这条线是如何绕成一个圆的,让Y等于u即可。 ? ? (沿着Y轴的圆) 这表明这条线从[0,-1,-1]开始,沿着顺时针方向弯曲,与函数的输入一致。

    1.6K40

    进阶渲染系列(一)——平坦和线框着色(导数和几何体)

    例如,我们当前片段的世界位置是 p 0 。屏幕空间X维度中下一个片段的位置是 p X 像素。因此,这两个片段之间在X维度上的世界位置变化率是。 ? 这是屏幕空间X维度中世界位置的偏导数。...这意味着导数仅在每个块中更改,每两个像素一次,而不是每个像素更改。结果,这些导数是一个近似值,当用于每个片段非线性变化的数据时,它们将显得块状化。...这可以通过将三角形的重心坐标添加到插值数据中来完成。 什么是重心坐标? 三角形具有三个分量的坐标。每个分量沿一个边为0,在与该边相对的顶点为1,在这两个边之间线性过渡。这些坐标也用于插值顶点数据。...请注意,重心坐标总是加起来为1。因此,只要传递两个就足够了,通过从1中减去其他两个来推导第三个坐标。这意味着我们必须内插一个较小的数字,让我们进行更改。 ?...此外,这些线还受视距的影响,因为它们是三角形的一部分。理想地,线具有固定的视觉厚度。 为了使线厚度在屏幕空间中保持恒定,我们必须调整用于smoothstep功能的范围。

    2.5K21

    SceneKit 场景编辑器-为您的AR体验构建3D舞台

    箭头表示坐标系。绿色箭头是Y轴,红色是X轴,蓝色箭头代表Z轴。移动它们以直观地重新定位模型。它们之间的弧度是一次用一个轴旋转对象。 视口控件 视口下方是视口控件。在这个栏上,我们可以改变到不同的视角。...位置 位置是您放置模型的位置。它由3D坐标组成:x,y和z。当所有坐标的初始位置设置为0时,它是应用程序加载时设备相机的起始位置。...发射前的地球 自定义模型 现在我们已经了解了场景编辑器的方法,我们如何使自己成为自定义模型?为了与我们的概念保持一致,我们将从Apple中选择一种设备。...相对位置 现在,我们希望将屏幕放在表壳的正中间。因此,x和y位置与情况相同,即为0。为了计算它的z位置,我们知道该情况的长度为1.14,其中心位于该值的一半,即0.57。...然后移动蓝色箭头,使z位置等于约-1.95。 父节点 表壳是表的主要部分。添加的其他部件相对于壳体定位。因此,我们将框设为[parent]节点。

    5.6K20

    (译)SDL编程入门(1)Hello SDL

    它将Windows/Linux/Mac/Android/iOS等工具包装起来,让你可以用SDL编写代码,然后编译到它所支持的任何平台。为了使用它,你需要安装它。 SDL作为一个动态链接库。...如果SDL初始化成功,我们要使用SDL_CreateWindow创建一个窗口。第一个参数设置窗口的标题或窗口的这一部分: ? 接下来的两个参数定义了窗口创建的x和y位置。...由于我们并不关心它创建的位置,所以我们只需将x和y的位置放入SDL_WINDOWPOS_UNDEFINED。 接下来的两个参数定义了窗口的宽度和高度。最后一个参数是创建标志。...为了保持本教程的简单性,我们在这里要做的就是使用SDL_FillRect将窗口的表面填充为白色。在这里不要太担心这个函数。本教程只关心如何让一个窗口弹出。...毫秒是1/1000秒。这意味着上面的代码将使窗口等待2000个1/1000秒或2秒。 需要注意的是,当SDL延迟时,它不能接受键盘或鼠标的输入。当你运行这个程序时,它没有反应,不要惊慌。

    3K40

    算法集锦(18) | 自动驾驶 | 车道线检测算法

    在这项任务中,一个关键的假设是,摄像机在所有这些图像上都保持在相同的位置,而且车道是平的,因此我们可以识别我们关注的关键区域。...看看上面的图片,我们根据汽车所在车道的轮廓“猜测”这个区域可能是什么,并定义一个多边形,它将作为我们的关注区域。 我们将精明的分割图像并排放在一起,观察如何只保留最相关的细节: ?...霍夫变换 下一步是应用霍夫变换技术提取线条并给它们上色。霍夫变换的目标是通过识别所有的点来找到线。这是通过将我们当前用轴(x,y)表示的系统转换成轴为(m, b)的参数系统来实现的。...左车道:当x值(即宽度)增大时,y值(即高度)减小:因此斜率必须为负 右车道:当x值(即宽度)增加时,y值(即高度)增加:因此斜率必须为正 因此,我们可以定义一个函数,将行分隔为左和右。...这工作相当首先在两个视频,甚至设法体面地挑战视频检测车道线,但由于有曲率的车道直线由一个简单的多项式学位1(即y = Ax¹+ b)是不够的。将来我将在弯曲的道路上设计更好的车道线。

    3K21

    Python 自动化指南(繁琐工作自动化)第二版:十九、处理图像

    坐标和框元组 图像像素用 x 和 y 坐标寻址,它们分别指定像素在图像中的水平和垂直位置。原点是图像左上角的像素,用符号(0, 0)指定。第一个零表示 x 坐标,从原点零开始,从左到右递增。...第二个零表示 y 坐标,从原点零开始,沿图像向下递增。这值得重复:y 坐标向下增加,这与你可能记得的数学课中使用的 y 坐标相反。图 19-1 展示了这个坐标系是如何工作的。...图 19-1:某种古代数据存储设备的28×27图像的 x 和 y 坐标 Pillow 的许多函数和方法都带有框元组参数。这意味着 Pillow 需要一个表示图像中矩形区域的四个整数坐标的元组。...如果将图像旋转其他角度,图像的原始大小将保持不变。在 Windows 上,黑色背景用于填充旋转产生的任何空隙,如图 19-8 中的所示。在 MacOS 上,透明像素被用于间隙。...该列表可以是 x 和 y 坐标元组的列表,例如[(x, y), (x, y), ...],或者是没有元组的 x 和 y 坐标的列表,例如[x1, y1, x2, y2, ...]。

    2.5K50

    基于matlab的机械臂仿真_移动机器人matlab运动学仿真

    旋量和向量相似的一个地方是,对它的描述也是相对于一个坐标系的。我们选择哪个坐标系呢?这里我们要参考 D-H 参数,每一个连杆坐标系在定义时都相对于前一个连杆的坐标系。...可以看到,不管机械臂如何运动,末端连杆(局部坐标系)的位置始终不动(但是它的姿态会改变,矩阵mask 的作用就是滤掉转动分量,只剩下沿 x 、 y 、 z x、y、z x、y、z 轴的平移运动)。...路径                    轨迹   如果我们画出红色和黑色轨迹的 x , y , z x,y,z x,y,z 坐标分量,就会看到它们从同一位置出发,又在另一个位置碰头,却经历了不同的过程...这里得到的是二维点的坐标,要想让我们的机械臂跟踪,需要将其转换为三维坐标,这很简单,你可以直接用替换命令:pts3D = pts /. {x_, y_} -> {x, y, 1.5}。...同样的,我给它一个初始角速度,不过这次不是随便给的,这个角速度只给中间那个轴(按照三个轴的转动惯量从小到大排列,也就是 y y y轴),然后给其它任意一个轴一点点扰动力矩(0.0001)以模拟空气等不理想情况下的扰动

    4.9K30

    用 MelonJS 开发一个游戏

    这就是为什么经过研究后,我决定用 MelonJS【http://www.melonjs.org/】 编写此快速教程的原因。 什么是 MelonJS?...这意味着你可以使用开箱即用的逼真的 2D 运动和碰撞检测。这很关键,因为必须解决所有这些问题,这需要大量的工作(更不用说数学运算了,这并不是我的菜)。...为了使本文保持合理的长度,我将只关注一个阶段,全方位的动作(换句话说,你将能够执行所有 5 个动作)、几个敌人、一种收藏品,还有数量可观的台阶供你跳来跳去。...为此将使用两个不同的UI元素: 一个用于图形,它将具有几个不同的帧,本质上一个用于正常图像,然后一个将每个方向显示为“selected”(与 ActionWordsService 上的 regionPostfix...这些是我正在使用的图层: HUD:它仅包含一个名为 HUD.ActionControl 的元素(重要的是要保持名称相同,一会儿你会明白为什么)。下图显示了此元素的属性(请注意自定义属性) ?

    1.6K10

    控件anchor和dock属性_控件的常用属性

    大家好,又见面了,我是你们的朋友全栈君。...在设计窗体时,这两个属性特别有用,如果用户认为改变窗口的大小并不容易,应确保窗口看起来显示的不是那么乱,并编写很多代码来实现这个效果,许多程序解决这个问题都是禁止给窗口重新设置大小 这显然是解决问题的最简单的方法...–表示控件中与父窗体(父控件)相关的右边缘应该保持固定 正如演示的那样,每个控件在父窗体上都自动的保持它的位置,需要注意的是: ①如果没有指定一个控件有左右锚定...,它将在父窗体中保留一个相对左右的位置,其它也是一样 ②如果选择了所有Anchor值的控件,控件只是在调整父窗体大小时,随着增大和缩小–与窗体的边缘比较起来它的所有边缘保持静止不变...和Anchor属性不同的是,可以将Dock属性设置为一个单值: *Top–迫使控件位于父窗体(或控件)的顶部,如果有同一个父窗体的其它子控件也被设置为停驻在顶部的话,那么控件将在彼此上方互相堆叠

    1.4K30

    Unity基础系列(二)——构建一个视图(可视化数学)

    这个结果是一个视图(graph)。 ? (用视图表示 x在(-2,2)的区间) 查看一个视图可以让我们快速了解一个函数是如何工作的。既然这么方便的话,那么我们就看下如何在Unity里创建吧。...赋值语句的一个属性是它们也可以用作表达式。这意味着您可以编写类似于y=(x+=3)的东西。这将使x增加3,并将其结果分配给y。这表明我们可以在while表达式中增加i,从而缩短代码块。 ?...1.8 用X来定义Y 我们的想法是,把立方体的位置定义为(x,f(x),0),这样我们就可以用这些点来展示一个函数了。此时,如果Y坐标始终为零,它表示简单的函数f(X)=0。...为了显示不同的函数,我们必须确定循环中的Y坐标,而不是之前的做法直接等于X,之前的函数可以表示为f(X)=x。 ? ? (Y等于X) 一个稍微不那么明显的函数是 ?...调整立方体颜色的一个简单方法是设置其材质的颜色属性,可以在循环里设置即可。但由于每个立方体都会得到不同的颜色,这意味着最终会变成每一个物体有一个单独的材质球。虽然这么做能实现,但效率太低。

    2.8K10

    Unity 水、流体、波纹基础系列(二)——方向流体(Directional Flow)

    (顺其自然的涟漪) 1 各向异性模式 让纹理变形以模拟流动时,它最终可能在任何方向上被拉伸或挤压。这意味着无论如何变形,看起来效果都还不错。但这仅在各向同性模式下才有可能。...它的制作方法与其他纹理相同,但图案不同,并且导数相对于高度数据的缩放比例为0.025。 ? (涟漪用的导数高度贴图) 导入纹理,确保它不在sRGB模式下,并将其用于扭曲效果。 ?...(滑动波纹模式) 2.2 纹理旋转 要旋转UV坐标,我们需要一个2D旋转矩阵,如“渲染1,矩阵”教程中所述。如果流向量 [x, y]具有单位长度,则它表示单位圆上的一个点。...这意味着灯光会受位置变化的影响,但不受旋转的影响。 为了保持灯光正确,我们必须旋转法线向量,这与旋转导数相同。...3 瓦片化流体 扭曲方法存在一个暂时性的问题,因为我们被迫在某个时候重置扭曲,以保持模式不变。通过跨时间在两个不同阶段之间进行融合来隐藏了这一点而已。定向方法也存在此问题,但是性质不同。

    4.5K50
    领券