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

Unity;向量3.向前,更改x位置,而不是声明z位置

Unity是一款跨平台的游戏开发引擎,它提供了丰富的工具和功能,用于创建高质量的游戏和交互式应用程序。Unity支持多种平台,包括PC、移动设备、主机游戏机等。

  1. Unity的概念: Unity是一种集成开发环境(IDE),用于创建2D和3D游戏、虚拟现实(VR)和增强现实(AR)应用程序。它提供了一个可视化的编辑器,允许开发者创建场景、添加对象、设置物理属性、编写脚本等。
  2. Unity的分类: Unity可以根据应用场景和目标平台进行分类。例如,Unity可以用于开发PC游戏、移动游戏、虚拟现实应用程序等。
  3. Unity的优势:
  4. 跨平台支持:Unity可以在多个平台上运行,包括Windows、Mac、iOS、Android等,使开发者能够轻松地将游戏或应用程序发布到不同的平台上。
  5. 强大的工具和资源:Unity提供了丰富的工具和资源,包括可视化编辑器、物理引擎、动画系统、粒子系统等,使开发者能够快速创建高质量的游戏和应用程序。
  6. 社区支持:Unity拥有庞大的开发者社区,开发者可以在社区中获取支持、学习经验和分享资源。
  7. 脚本编程:Unity使用C#作为主要的脚本编程语言,开发者可以利用C#编写游戏逻辑、控制对象行为等。
  8. Unity的应用场景: Unity广泛应用于游戏开发、虚拟现实和增强现实应用程序开发等领域。它可以用于开发各种类型的游戏,包括动作游戏、冒险游戏、益智游戏等。此外,Unity还可以用于创建虚拟现实和增强现实应用程序,如虚拟培训、虚拟旅游、AR游戏等。
  9. 腾讯云相关产品和产品介绍链接地址: 腾讯云提供了一系列与Unity相关的产品和服务,包括云服务器、云存储、云数据库等。具体的产品介绍和链接地址可以在腾讯云官方网站上找到,例如:
  10. 云服务器(ECS):提供可扩展的计算资源,用于部署和运行Unity应用程序。链接地址:https://cloud.tencent.com/product/cvm
  11. 云存储(COS):提供可靠、安全的对象存储服务,用于存储Unity应用程序的资源文件、用户数据等。链接地址:https://cloud.tencent.com/product/cos
  12. 云数据库(CDB):提供高性能、可扩展的数据库服务,用于存储和管理Unity应用程序的数据。链接地址:https://cloud.tencent.com/product/cdb

请注意,以上只是示例,腾讯云还提供其他与Unity相关的产品和服务,具体可根据实际需求进行选择和使用。

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

相关·内容

Unity精华☀️点乘、叉乘终极教程:用《小小梦魇》讲解这个面试题~

点乘计算面向还是背向 我们先来看第一个问题: 怪物移动、追踪主角时,判断怪物的是否面向主角 1️⃣ 面向背向的定义 我们先来声明一下定义哈 这儿的面向,并不是两个人面对面,而是比如说两个人向前的夹角在...自动寻路,只能控制位置移动,不能控制旋转呢。 2️⃣ 推导逻辑 a X b = c , c⊥a,c⊥b。 叉乘得到是:一个与这两个向量都垂直的向量。...向量都是有方向的, 比如我们的a、b两个向量x1,y1,z1)(x2,y2,z2) 都在x、y平面,那这两个向量相乘,结果的x、y值肯定为正,只需判断Z值,根据正负即可知道右手螺旋法则大拇指朝上还是朝下...同理,z、y平面,则判断x 3️⃣ Unity代码 请注意: Unity当中使用左手,因为Unity使用的是左手坐标系 任意物体的坐标不应是原点,因为0x任何数都为0,判断不了方向。...Z值 当以X轴为前方时, 当B在A右侧时,Y值>0 当B在A左侧时,Y值<0 在Y、Z平面,看X值 如果以Z轴方向为前方: 当B在A右侧时,X值<0 当B在A左侧时,X值>0 如果以Y轴方向为前方:

12010

Unity3D游戏开发初探—2.初步了解3D模型基础

其余的手指指向前方。如下图所示,这样就建立了一个左手坐标系。拇指、食指和其余手指分别代表x,y,z轴的正方向。...image.png ④左手坐标系与右手坐标系的比较 左手坐标系是X轴向右,Y轴向上,Z向前,右手坐标系的Z轴正好相反,是指向“自己”的,在计算机中通常使用的是左手坐标系,数学中则通常使用右手坐标系...Vector3是Unity中定义的一个含有x、y、z三个字段的类,可以表示位置点,也可以表示一个向量。 ?   ...已知小球在摄像机位置(即是一个摄像头所在的向量,假设其为v2),以及鼠标所指向的位置坐标后(即为目标地向量,假设其为v1),通过v1-v2即可得到要发射的具体方向的向量(相当于告诉小球朝哪个目标方向发射...出处:http://www.cnblogs.com/edisonchou/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

1.6K30
  • Unity基础教程系列(新)(一)——游戏对象和脚本(Creating+a+Clock)

    Unity中,X轴指向右,Y轴指向上方,Z轴指向前方。因此,让我们在设计时钟时要牢记相同的方向,这意味着当我们沿Z轴查看时钟时会看到其正面。...(Hour indicator子节点) 将其X比例设置为0.5,将Y比例设置为1,将Z比例设置为0.1,以使其成为一个狭窄的扁平长块。然后将其X位置设置为0,Y位置设置为4,Z位置设置为-0.25。...将其X位置设置为2,将Y位置设置为3.464,将Z旋转设置为-30。然后将其复制为小时2,交换其X和Y位置,并将其Z旋转加倍至-60。 ? (小时1和小时2) 这些数字从哪里来的?...(所有的指针层次) Minutes Arm应该比Hours Arm窄且更长,因此将其X比例设置为0.2,将Y比例设置为4,然后将其Y位置增加到1。还要将其Z位置更改为-0.35,使其位于小时臂的顶部。...为了使时钟与当前时间保持同步,请将Awake方法的名称更改为Update。这是另一种特殊的事件方法,只要我们处于播放模式,Unity就会在每一帧不是一次调用该方法。 ? ?

    4.3K20

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

    更改位置的工作方式相同,不同之处在于,我们需要为localPosition属性分配3D向量。 使用Vector3结构类型创建3D向量。例如,将点的X坐标设置为1,将其Y和Z坐标保持为零。...让我们对其进行更改,使我们从零开始,将第一个立方体定位在原点。我们可以将所有点向左移动一个单位,方法是向右乘以(i-1)不是i。...但是,现在我们在比较之前不是之后增加i,这样可以减少迭代次数。特别是对于现在的情况,可以将递增和递减运算符放在变量之后,不是放在变量之前。该表达式的结果是更改前的原始值。 ?...Vector3结构具有三个float字段:x,y和z。这些字段是公开的,因此我们可以对其进行更改。 如果我们说x= 3,然后x= 5,我们给x 分配了一个不同的数字,没有把数字3修改成5。...(上色了的点) 现在,世界X位置控制该点的红色分量,Y位置控制该绿色分量,Z控制蓝色。但是我们图的X域是-1~1,负颜色分量没有意义。因此,我们需要将位置减半,然后加½以使颜色适合于域。

    2.6K50

    Unity 点乘和叉乘的原理和使用

    v1和v2向量的点乘运算:相应元素的乘积的和:v1( x1, y1,z1) * v2(x2, y2,z2) = x1*x2 + y1*y2+z1*z2; 注意 : 结果不是一个向量,而是一个标量。...v1和v2向量的叉乘运算:相应元素的乘积的和:v1( x1, y1,z1) x v2(x2, y2, z2) = (y1*z2 – y2*z1)i+(x2*z1 – x1*z2)j+(x1*y2-x2...a||b| sin 性质3:(数学上)满足右手法则, a x b = -b x a,所以我们可以使用叉乘的正负值来判断a,b的相对位置,即b是处于a的顺时针还是逆时针方向。...(大拇指应与食指成九十度)(注意:Unity当中使用左手,因为Unity使用的是左手坐标系) 数学上叉乘的右手法则 Unity当中叉乘的左手法则 Unity项目应用: 1.根据叉乘得到a,b向量的相对位置...3.根据叉乘大小,得到a,b向量所形成的平行四边形的面积大小,根据面积大小得到向量的相对大小。

    1.5K10

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

    要将其变成指向上的法向矢量,我们必须将切线绕Z轴旋转90°。 ? ? (使用实际的法线) 矢量旋转如何工作的? 通过交换向量X和Y分量,并翻转新的X分量的符号,可以将2D向量逆时针旋转90°。...这意味着结果的方向取决于向量的顺序。因为我们希望向量指向上方,所以我们必须使用cross(ty,tx),不是cross(tx,ty)。...即使纹理预览显示RGB编码,Unity实际上仍使用DXT5nm。 DXT5nm格式仅存储法线的X和Y分量。其Z分量将被丢弃。如你所料,Y分量存储在G通道中。但是,X分量存储在A通道中。...可以在计算Z之前缩放法线的X和Y分量。如果减小X和Y,则Z会变大,从而导致平面变平。如果我们增加它们,将会发生相反的情况。因此,可以通过这种方式调整凹凸。...按照惯例,此向量与U轴匹配,指向右侧。 第三个向量称为B,副切线或副法线。正如Unity将其称为副法线一样,我也这么称呼。此向量定义V轴,指向前方。导出二进制切线的标准方法是通过B = N×T。

    3.7K40

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

    三维向量是用[Vector3]的结构创建的。因为它是一个struct,它的作用就像一个值,就像是一个数字一样,不是对象。例如,让我们将点的X坐标设为1,将其Y和Z坐标设为零。...然而,现在我们在比较之前就增加i,不是事后,这将导致少一个迭代的执行。在这种情况下,增量和递减运算符也可以放在变量之后,不是在变量之前。该表达式的结果是更改前的原始值。 ?...我们也可以为循环之前的位置定义一个变量。当我们沿着X轴创建一条线时,我们只需要调整环内位置X坐标不再需要乘以向量Vector3.right。 ? 是否可以单独改变向量的分量?...在本教程中,我们假设分辨率仅通过检查器面板进行调整,不是代码或者其他地方。 2.2 变量实例化 要实际使用分辨率,我们必须更改实例化的立方体数量。...然后找到那个点的位置。 ? 现在,我们可以设置位置的Y坐标,就像我们之前所做的那样。只是把它从Awake挪到Update里来。 ? 因为向量不是对象,所以只能调整一个局部变量。

    2.8K10

    Unity可编程渲染管线系列(三)光照(单通道 正向渲染)

    像在C#中一样,在着色器中定义数组,但方括号在变量名称之后不是类型后面。 ? 但是,我们不能任意定义数组的大小。数组定义必须立即声明其大小。让我们使用4的数组长度。...更改此设置仅会在重新应用其图形设置时影响编辑器,该设置不会自动发生。进入和退出播放模式将应用它。 除此之外,定向光的方向由其旋转确定。光线沿其局部Z轴发光。...因此,在将向量分配给visibleLightDirections之前,必须对其求反。由于方向向量的第四个分量始终为零,因此我们只需要取反X,Y和Z。 ?...聚光灯的工作方式类似于点光源,但仅限于圆锥形不是向各个方向发光。 4.1 聚光方向 像定向光一样,聚光灯沿其局部Z轴发光,但呈圆锥形。而且它还有一个位置,这意味着我们必须同时提供二者数据给聚光灯。...重新编译后,Unity将警告我们我们已经超出了先前的数组大小。不幸的是,不可能仅在着色器中更改固定数组的大小。那是图形API的限制,不是我们可以做的事情。

    2.2K20

    基础渲染系列(十五)——延迟光照

    然后,请在片段程序中为CreateLight提供世界位置和视图深度。视图深度是片段在视图空间中位置Z分量。 ? ?...(不正确的LDR颜色) 首先,必须将编码的LDR颜色乘以光缓冲区,不是相加。我们可以通过将着色器的混合模式更改为Blend DstColor Zero来实现。但是,如果这样做,HDR渲染将出错。...仍然渲染光线的技巧是绘制金字塔的内表面,不是金字塔的外表面。这是通过渲染其背面不是其正面来完成的。同样,仅当这些表面最终位于已经渲染的表面之后时才渲染它们。这种方法还涵盖了聚光灯体积内的所有片段。...(Cookie衰减) 这实际上导致了两个光锥,一个向前,一个向后。向后的圆锥体通常会终止于渲染区域的外部,但这不是必然的。因此,需要与一个负W坐标相对应的正向圆锥。 ?...但是,在这种情况下,我们需要一个立方体贴图不是常规纹理。 ? 要对Cookie进行采样,请将片段的世界位置转换为浅色空间,然后使用该采样对立方体贴图进行采样。 ? ?

    3.4K10

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

    它与位置处理方式几乎相同,只是比例分量被乘不是被添加到原始点。 ? 也把该组件添加到我们的网格对象中。现在我们也可以缩放网格。请注意,我们仅调整网格点的位置,因此缩放不会更改其可视化效果的大小。...那不是点,而是向量,代表一个方向。 所以 ? 代表一个点, ? 表示向量。这概念很有用,因为这意味着我们可以使用相同的矩阵来变换位置,法线和切线。...4.2 使用矩阵 我们可以使用Unity的Matrix4x4结构执行矩阵乘法。从现在开始,我们将使用它来执行转换,不是之前的方法。...如果是要乘以一个方向不是一个点,则可以使用Matrix4x4.MultiplyVector。 现在,具体的转换类必须将其Apply方法更改为Matrix属性。...这将需要投影到立方体不是平面中,因此深度信息需要保留下来。 再有就是要关心视图纵横比。 另外,Unity的相机朝负Z方向看,还需要取反一些数字。 你可以将所有内容合并到投影矩阵中。

    4.9K23

    进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】

    本教程使用Unity 2017.4.1f1制作 ? (不需要顶点UV坐标或切向量) 1 没有UV坐标的纹理 执行纹理映射的通常方法是使用网格中每个顶点存储的UV坐标。但这不是唯一的方法。...然后将alpha代码更改为依靠surface.alpha不是调用GetAlpha。还要移动InitializeFragmentNormal,以便在配置表面之前处理法线向量。 ?...1.4 没有切线空间 请注意,与Unity的表面着色器方法不同,我们在世界空间不是切线空间中使用法线向量。如果要在SURFACE_FUNCTION中使用切线空间法线贴图,则必须自己明确地执行此操作。...在Y投影的情况下,向上方向对应于Y,不是Z。因此,我们必须交换Y和Z才能从切线空间转换为世界空间。同样,我们必须将XZ交换为X投影。 ? ?...是的,当进行光照贴图时,我们最终使用对象空间不是世界空间。发生这种情况是因为Unity没有为meta pass设置对象到世界的转换矩阵。

    2.4K30

    基础渲染系列(八)——反射

    下一步,假设我们在这个房间的任何地方都有一个表面位置和一个反射方向。向量最终将在某处与立方体的边缘相交。我们只需一点数学就可以计算出这个交点。然后,我们可以构造一个从房间中心到此点的向量。...我将其设置得比它大一点,以防止由于场景视图中的gizmos的Z角冲突导致闪烁。 ? ?...首先,调整边界,使其相对于表面位置。 ? 接下来,我们必须缩放方向矢量,使其从该位置到达所需的交点。让我们首先考虑X维度。如果方向的X分量为正,则指向最大边界。否则,它指向最小范围。...将适当的边界除以该方向的X分量即可得到所需的标量。当方向为负时,这也适用,因为最小边界也为负,因此除法后会产生正结果。 ? Y和Z尺寸也是如此。 ? 现在,我们有三个标量,但是哪个是正确的?...Unity也在标准着色器中执行此操作。声明一下,这是一个通用分支。 ? 当目标平台无法处理时,Unity的着色器也会禁用混合。

    3.9K30

    Unity基础教程系列(七)——可配置形状(Variety of Randomness)

    每个Update中,将速度乘以时间增量设置到形状的位置。我们可以使用局部位置不是更昂贵的position属性,因为形状始终是根对象。 ? 2.2 保存速度 保存速度,直接在角速度之后写入速度。 ?...向外移动的正确方向是通过从形状的位置减去区域的位置并将结果归一化来找到的。注意,我们必须使用transform.position,不是本地位置,因为生成区域不需要是根对象。...除此之外,还可以一起声明多个标签,如case1:case2:DoAB();break; 等于if(x == 1 || x == 2){DoAB(); }。也可以使用goto跳转到另一种情况。...位置不应该命名为area,rect或类似名称吗? 那会更有意义,因为它实际上描述的是矩形UI区域,不仅仅是位置。但是Unity一直使用Position,因此我也会这样做。 ? ?...这就使它们成为对变量的引用(就像它们是对象不是浮点数一样),因此MinMaxSlider可以更改它们。这是必需的,因为方法不能返回两个值。 ? ?

    2.7K30

    Shader经验分享

    ,该公式不适合矩阵与矩阵) 坐标转换: o.pos = mul(UNITY_MATRIX_MVP, v.vertex);顶点位置模型空间到齐次空间 o.worldNormal = mul((float3x3...一般存在切线空间,z轴法线方向,x轴切线方向,y轴副(法)切线方向 TANGENT_SPACE_ROTATION;//Unity来获取rotation矩阵,从模型空间到切线空间变换的矩阵。...ZTest Always //指的是直接将当前像素颜色(不是深度)写进颜色缓冲区中 相当于ZTest Off ZTest Never//Never指的是不要将当前像素颜色写进颜色缓冲区中,相当于消失。...Multiplicative2倍乘法 BlendOp OP//对源和目标颜色进行其他操作,不是默认的相加,op操作包括: Add //相加 Sub//源颜色减目标颜色 RevSub//目标颜色减源颜色...地面雾效:通过深度值和摄像机的方向向量计算该点到摄像机的偏移量,再加上摄像机的位置得到该顶点在世界空间中的坐标,然后把该坐标的y值参与雾效计算。如果用坐标z参与计算和深度雾类似。

    2.1K40

    Unity基础教程系列(新)(六)——Jobs(Animating a Fractal)

    由于我们不使用转换层次结构,因此位置会随着分形动画的变化改变,因此我们将继续在Update中不是在Awake中进行设置。但是首先我们需要存储部件的数据。...顶点位置节点完全相同,只是我们现在必须依赖FractalGPU HLSL文件。不是根据世界位置进行着色,反照率就可以使用单一的颜色属性。 ?...相反,它们具有lossyScale属性,以指示它可能不是精确的仿射尺度。我们将简单地使用该比例的X分量,忽略任何不均匀的比例。 ? 同时将调整后的世界位置和比例应用于边界。 ?...数学库使用弧度不是度数,因此用0.5f * PI更改所有90f实例。除此之外,四元数还具有用于绕X,Y或Z轴创建旋转的单独方法,这些方法比通用的Euler方法更有效。 ?...通过调用带有四个列向量的float3x4来创建最终矩阵,四列向量是3×3矩阵的三列(存储在其c0,c1和c2字段中),然后是零件的位置。 ? 对Update中的根部件执行相同的操作。 ?

    3.6K31

    基础渲染系列(二)——着色器

    (用你自己着色器的材质球) 更改我们的球体对象,使其使用我们自己的材质,不是默认材质。球体将变为洋红色。发生这种情况是因为Unity切换到错误的着色器了,该着色器使用此颜色来引起你对问题的注意。...C#类中可以毫无顾及地更改中的字段和方法的顺序,但对于着色器而言并非如此。编译器从上到下工作。它不会向前看。 现在,已编译的片段程序包括tint变量。 ? ? ?...要访问插补的局部位置,请将参数添加到片段程序中。因为我们只需要X,Y和Z组件,所以我们可以用float3。然后,我们可以输出位置,就好像它是一种颜色一样。...要通过顶点程序传递数据,请将X,Y和Z分量从position复制到localPosition。 ? .xyz是做什么的? 这被称为swizzle操作。就像访问向量的单个组件一样,但是更加灵活。...因为Unity一直使用_ST,并且向后兼容要求它保持这种方式,哪怕术语可能已更改了。 ? tiling 向量用于缩放纹理,因此默认情况下为(1,1)。它存储在变量的XY部分中。

    3.9K20

    UnityShader 表面着色器简单例程集合

    ⑥延展 前面的讨论中我们提及,环境映射假设离物体无限远,这是因为我们的立方体纹理存取只取决于世界坐标下的反射向量,反射向量只决定了方向,没有决定距离,即反射向量方向相同时,位置上的变化不影响表面反射外观...,可以这样: normalComponent = 2 * (colorComponent - 0.5) 总结上面这几段话:通过使用一个RGB纹理的红色、绿色、蓝色分量来存储一个法向量x、y和z分量...③从高度图生成法向量贴图 高度图纹理对每个像素的高度进行编码,不是向量进行编码,因此,高度图在每个纹理元素存储了一个单独的无符号分量,不是使用3个分量来存储一个向量。...z分量通常被存储在蓝色分量重,范围压缩把z值转化到[0.5,1]范围,因此,存储一个RGB纹理中经过范围压缩的法向量贴图最主要的颜色的蓝色: ?...注意Queue Tags必须写在subshader中,不是在pass中。 除了unity提供的预定义tags外,我们也可以定义自己的队列标签。

    3.2K61

    手把手带你用机器学习写unity AI

    2017unity机器学习社区挑战赛参加地址:https://connect.unity.com/challenges/ml-agents-1 打开下载的unity机器学习环境 里面有一些现成的demo...collision.gameObject.tag=="Player") { Destroy(ball); } } 3,生成角色虚拟视线 void DrawFieldOfView() { // 获得最左边那条射线的向量...所以这里CollectState()内传到Brain的都是单个数值,比如要传角色的位置,传Vector3类型是不行的,因为Vector3是有3个值得向量x,y,z),所以你要传角色位置,你把3个方向的数值一个个传...比如在这个demo中我把act设置为离散,因为角色的行为无非是左转右转和向前,那么我们把act为0时作为角色向前的信号,1和2作为角色向左和向右,用离散就合适了,离散和连续在Brain中的action设置即可...=50player.transform.position.x=50player.transform.position.z { reward = -10f; done = true; } } AgentReset

    1.1K70

    Unity通用渲染管线(URP)系列(五)——烘焙光(Baked Light)

    我们要告诉Unity需要这么干,但这次是通过PerObjectData.LightProbe不是PerObjectData.Lightmaps。...将纹理和采样器传递给它,然后传递世界位置和法线。之后是矩阵,分别是unity_ProbeVolumeParams的Y和Z分量,然后是min和size-inv数据的XYZ部分。 ? ?...实际上,除非OpenGL显式使用Z坐标,否则它似乎无法工作。我们将使用Unity自己的元通道使用的相同虚拟分配,即input.positionOS.z> 0.0?...通过bool4 unity_MetaFragmentControl标志向量传达请求的内容。 ? 如果设置了X标志,则要求使用漫反射率,因此使其成为RGB结果。a分量应设置为1。 ?...这样就可以通过检查器配置亮度大于1的颜色,从而显示HRD颜色弹出窗口,不是常规的颜色弹出窗口。

    8.6K20

    Unity基础教程系列(新)(三)——数学表面(Sculpting with Numbers)

    它将切换到为新功能并添加动画效果,Unity不会意识到它们更改过。 虽然在播放模式下更改代码很方便,但在多种功能之间来回切换并不是一种方便的方法。如果我们可以通过视图的配置选项更改功能,那样更简单。...3.5 结合Z轴 在Wave函数中使用Z的最简单方法是使用XZ的总和不是X。这将产生斜波。 ? ? (斜波) 对于MultiSine,最直接的更改是使每个wave使用一个单独的维度。...为了使之成为可能,我们的函数不仅必须输出Y,还必须输出XZ。 4.1 三维函数 如果我们的函数是输出3D位置不是1D值,则可以使用它们来创建任意表面。例如 ? 描述了XZ平面。 ?...可以通过将Update中的循环替换为Awake中使用的循环来解决此问题,但现在我们可以直接将函数结果分配给该点的位置。 ? 请注意,当z更改时,我们仅需要重新计算v。...但是,这种方法主要是遍历点不是维度。即使在播放模式下更改分辨率时,它最终更新的也是所有点。 我们不再需要在Awake中初始化位置,因此可以使该方法更加简单。我们只需设置缩放值和父节点即可。 ?

    1.5K40
    领券