小程序获取页面的输入值input-buttom

一:立即刷新(我自己也不知道为什么,在手机上并不能显示button按钮)

WXML:

<input class='address'type="text" placeholder="合肥市蜀山区蔚蓝商务港A座" bindinput="voteTitle"><button >查询</button></input>(本来是想点击再查询,谁知道直接刷新了,所以button标签没有用)

js:

data:{

voteTitle: null,

}

voteTitle: function(e) {

this.data.voteTitle = e.detail.value;

console.log(this.data.voteTitle);

},

二:点击刷新(在手机上并不能显示button按钮)

WXML:

<input class='address'type="text" placeholder="合肥市蜀山区蔚蓝商务港A座" bindinput="valueTitle"><button bindtap='query'>查询</button></input>(这个可以)

js:

data:{

valuesTitle:'',

}

valueTitle:function(e){

this.setData({

valuesTitle: e.detail.value

})

},

query: function(e) {

console.log("查询:" + this.data.valuesTitle);

},

三:(在手机上能显示button按钮,与二相比,并没有改变什么)

WXML:

<input class='address'type="text" placeholder="合肥市蜀山区蔚蓝商务港A座" bindinput="valueTitles"></input>

<button class='address' bindtap='querys'>查询</button>

js:

data:{

valuesTitles:'',

}

valueTitles:function(e){

this.setData({

valuesTitles: e.detail.value

})

},

querys: function(e) {

console.log("查询:" + this.data.valuesTitles);

},

 

<think>我们讨论的是如何通过修改顶点坐标和纹理坐标来实现90度旋转,并使用glBufferData更新数据。关键点:1.顶点坐标的旋转:绕原点逆时针旋转90度的变换矩阵为:|0-1||10|对于每个顶点(x,y),新的坐标为(-y,x)。如果顶点是3D的,z坐标不变。2.纹理坐标的处理:一般情况下,如果我们只旋转顶点,而纹理坐标不变,那么纹理会随着顶点旋转。但是,如果我们希望纹理本身也旋转90度,那么需要修改纹理坐标。纹理坐标的旋转:类似地,将纹理坐标(u,v)旋转90度后,新的坐标应该是(v,1.0-u)或者(u,v)->(v,u)并调整方向?但实际上,常见的需求可能是旋转整个矩形(包括纹理)90度,所以纹理坐标也需要相应旋转。注意:旋转90度后,纹理可能会颠倒,因此可能需要调整。一个常见的纹理旋转90度(逆时针)的变换是:u_new=vv_new=1.0-u为什么是1.0-u?因为纹理坐标的原点在左下角,旋转90度后,原来的左下角会变成右下角?但实际上,我们可以这样考虑:将纹理坐标看作一个点,绕纹理坐标中心(0.5,0.5)旋转90度。但简单起见,如果原始纹理坐标是(u,v),逆时针旋转90度后,我们可以这样计算:u_new=vv_new=1.0-u这个变换实际上是将纹理坐标从(u,v)变成(v,1-u),相当于先关于y轴翻转(即u坐标取反)再旋转90度?实际上,直接旋转90度而不翻转应该是:u_new=v,v_new=1-u?这里有一个常见的做法:如果不调整,旋转后纹理会是颠倒的,因此需要上下翻转。所以更常见的做法是旋转后再加上一次翻转。但如果我们只做90度旋转并且希望正确显示,可以使用上面的公式。不过,根据之前用户提到的,在引用中并没有关于纹理旋转的具体做法,但是用户在上次对话中我们给出过纹理旋转90度的公式:将纹理坐标旋转90度(以左上角为原点):u_new=original_v;v_new=1.0-original_u;但注意:OpenGL纹理坐标原点在左下角。如果我们有一个矩形,其纹理坐标是左下角(0,0),右下角(1,0),左上角(0,1),右上角(1,1)。逆时针旋转90度后,原来的左下角(0,0)应该变成左上角(0,1)?不对,应该是变成右下角(1,0)?我们画图:原始四个顶点纹理坐标:A(0,0)--左下B(1,0)--右下C(0,1)--左上D(1,1)--右上旋转90度后,我们希望:A(0,0)->(0,1)->左上角B(1,0)->(0,0)->左下角C(0,1)->(1,1)->右上角D(1,1)->(1,0)->右下角但是按上面公式:u_new=v,v_new=1.0-uA(0,0):u_new=0,v_new=1-0=1->(0,1)左上角->正确,对应原始C的位置B(1,0):u_new=0,v_new=1-1=0->(0,0)左下角->正确,对应原始A的位置C(0,1):u_new=1,v_new=1-0=1->(1,1)右上角->正确,对应原始D的位置D(1,1):u_new=1,v_new=1-1=0->(1,0)右下角->正确,对应原始B的位置这样旋转后,四个点的纹理坐标仍然对应整个纹理,并且旋转了90度。然而,如果只是旋转顶点而不旋转纹理坐标,那么纹理会随着顶点旋转,但不会出现撕裂,只是方向变了。这里我们要实现整个矩形(包括纹理)旋转90度,所以需要同时修改顶点坐标和纹理坐标。步骤:1.获取原始顶点数据(包括位置和纹理坐标)2.对每个顶点,修改其位置(应用旋转矩阵)3.对每个顶点,修改其纹理坐标(应用旋转公式)4.使用glBufferData将新数据上传到GPU注意:顶点位置旋转后,矩形的位置也会旋转。如果原始矩形是绕其中心旋转,则需要先平移到原点,旋转后再平移回来。但一般我们这里讨论的是绕原点(0,0)旋转。如果矩形不在原点,那么旋转后位置会改变。所以通常我们会在模型矩阵中进行这样的变换。但按照用户要求,我们直接修改顶点坐标。示例:假设我们有一个矩形(两个三角形组成),原始顶点数据为:顶点位置(x,y,z)和纹理坐标(u,v)交替存储一个顶点6个(x,y,z,u,v)?或者可能是分开的?但通常我们会交错存储在一个数组。假设数据格式为:[x1,y1,z1,u1,v1,x2,y2,z2,u2,v2,...]但注意:为了简单,我们考虑每个顶点有5个属性:x,y,z,u,v(即位置是3D,纹理是2D)。那么每个顶点占5个float。旋转操作:对于位置:x_new=-y_old;y_new=x_old;z_new=z_old对于纹理:u_new=v_old;v_new=1.0f-u_old然后更新整个顶点缓冲区。代码示例:假设已经有一个顶点数组,每个顶点包含位置(x,y,z)和纹理坐标(u,v)。我们生成一个新的顶点数组,并应用变换。注意:原始顶点数组可能是多个顶点,我们需要遍历每一个。</think> ### 通过 `glBufferData` 实现90度旋转的完整方案 #### 1. 90度旋转变换原理 绕 Z 轴旋转90度的顶点变换矩阵为: $$ \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} $$ 顶点坐标变换公式: $$ \begin{cases} x_{\text{new}} = -y_{\text{old}} \\ y_{\text{new}} = x_{\text{old}} \\ z_{\text{new}} = z_{\text{old}} \end{cases} $$ 纹理坐标变换公式(避免镜像): $$ \begin{cases} u_{\text{new}} = v_{\text{old}} \\ v_{\text{new}} = 1.0 - u_{\text{old}} \end{cases} $$ #### 2. 顶点数据结构 假设使用交错存储格式: ```cpp struct Vertex { float x, y, z; // 位置坐标 float u, v; // 纹理坐标 }; ``` #### 3. C++ 实现代码 ```cpp // 1. 准备原始顶点数据 const int vertexCount = 4; // 矩形顶点数 Vertex originalVertices[] = { // 位置 // 纹理坐标 {-0.5f, -0.5f, 0.0f, 0.0f, 0.0f}, // 左下 { 0.5f, -0.5f, 0.0f, 1.0f, 0.0f}, // 右下 { 0.5f, 0.5f, 0.0f, 1.0f, 1.0f}, // 右上 {-0.5f, 0.5f, 0.0f, 0.0f, 1.0f} // 左上 }; // 2. 创建旋转后顶点数组 Vertex rotatedVertices[vertexCount]; // 3. 应用旋转变换 for (int i = 0; i < vertexCount; ++i) { // 位置旋转90度 rotatedVertices[i].x = -originalVertices[i].y; rotatedVertices[i].y = originalVertices[i].x; rotatedVertices[i].z = originalVertices[i].z; // 纹理坐标旋转 rotatedVertices[i].u = originalVertices[i].v; rotatedVertices[i].v = 1.0f - originalVertices[i].u; } // 4. 更新缓冲区数据 glBindBuffer(GL_ARRAY_BUFFER, vbo); // 绑定顶点缓冲对象[^2] glBufferData(GL_ARRAY_BUFFER, sizeof(rotatedVertices), rotatedVertices, GL_DYNAMIC_DRAW); // 动态更新标志 // 5. 配置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); // 位置属性[^2] glEnableVertexAttribArray(0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, u)); // UV属性[^2] glEnableVertexAttribArray(1); // 6. 绘制旋转后的矩形 glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount); // 使用三角形扇绘制矩形 ``` #### 4. 关键注意事项 1. **顶点属性配置**: - 确保 `glVertexAttribPointer` 的参数与数据结构匹配 - 位置属性 stride 应为 `5*sizeof(float)`,纹理属性指针偏移应为 `(void*)(3*sizeof(float))`[^2] 2. **动态更新优化**: - 频繁更新时使用 `GL_DYNAMIC_DRAW` 标志 - 避免每次旋转都创建新数组,可复用内存空间 - 仅更新变化部分时使用 `glBufferSubData` 替代 `glBufferData` 3. **绕中心旋转**: 若需绕几何中心旋转,需先平移到原点: ```cpp float centerX = 0.0f, centerY = 0.0f; // 计算中心点 // 应用平移和旋转复合变换: rotatedVertices[i].x = -(y_old - centerY) + centerX; rotatedVertices[i].y = (x_old - centerX) + centerY; ``` #### 5. 替代方案比较 | 方法 | 优点 | 缺点 | 适用场景 | |------|------|------|---------| | `glBufferData` 修改顶点 | 无需着色器修改 | CPU开销大 | 静态旋转/移动端 | | 顶点着色器旋转 | GPU加速 | 需矩阵计算逻辑 | 动态旋转/复杂变换[^3] | | 实例化渲染 | 高效批量处理 | 实现复杂 | 重复对象绘制[^1] | > **性能建议**:对于动态旋转动画,应在顶点着色器中实现: > ```glsl > uniform mat4 rotationMatrix; > void main() { > gl_Position = rotationMatrix * vec4(aPos, 1.0); > } > ``` #### 6. 常见问题解答 **Q1: 旋转后纹理变反怎么解决?** A: 使用正确的纹理坐标变换: ```cpp // 修正版纹理旋转 rotatedVertices[i].u = originalVertices[i].v; rotatedVertices[i].v = 1.0f - originalVertices[i].u; ``` **Q2: 模型旋转后消失的原因?** A: 检查: 1. 顶点是否被旋转到裁剪空间外 2. 深度缓冲区配置是否正确 3. 旋转后模型是否超出近裁剪平面 **Q3: 法线向量需要旋转吗?** A: 是,法线需应用相同的旋转矩阵: ```cpp // 法线旋转(需单独处理) normal_new = mat3(rotationMatrix) * normal_old; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值