HoudiniVex笔记_P22_RemappingBasics重映射

本文介绍了Houdini19.5中的VEX函数,如fit、fit01、fit10等,用于数据映射和算法设计,包括噪声处理、距离计算、周期性变化和插值操作,以及UV映射的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原视频:https://www.youtube.com/playlist?list=PLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI
Bili:Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili
 

Houdini版本:19.5

1、fit函数

取范围(omin,omax)中的值,并将其映射到新范围(nmin,nmax)中的相应值。

2、fit01函数

如果(omin,omax)值范围是(0~1),可直接使用fit01函数将其映射到新范围(nmin,nmax)中。

 3、fit10函数

与fit01相似,只不过(omin,omax)值范围是(1~0)。当然,直接使用fit01函数,改变(nmin,nmax)能达到同样的效果。

4、fit11函数

 取范围(-1,1)中的值,并将其移动到新范围(nmin,nmax)中的相应值。

5、efit函数

 取范围(omin,omax)中的值,并将其移动到新范围(nmin,nmax)中的相应值。与fit不同,函数不会将value值钳制在给定范围内。多与三角函数/角度值等结合使用。

 6、Exercise—重映射与噪波

记录下。

eg.先上结果,(scale==1.5)(min_height==-0.5,max_height==0.5)

①节点连接及设置,

②完整代码如下,

//noise_value节点
vector pos = @P * chf('scale');
vector4 seed = set(pos.x, pos.y, pos.z, @Time);

float noiseval = noise(seed);
f@noiseval = noiseval;
//remap节点
float minval = detail(0, 'minnoiseval');
float maxval = detail(0, 'maxnoiseval');

float minheight = chf('min_height');
float maxheight = chf('max_height');

float height = fit(f@noiseval, minval, maxval, minheight, maxheight);

@P += @N * height;

7、Exercise—重映射与距离

对模型搞个大波浪(三角函数周期与映射)。

surfacedist() 函数:返回点与模型的最近距离

理论:
①在空间中添加随意点,根据模型与该点的距离进行上色,

加上efit函数,可是其表面颜色呈周期性变化(一圈又一圈),

操作:
①节点设置如下,

②类型为Points的ripple_surface节点代码如下,

vector npos = point(1, 'P', 0);
int npt = nearpoint(0, npos);

int closest = -1;   //模型上最近距离点的点号@ptnum
float dist = surfacedist(0, itoa(npt), 'P', @ptnum, closest, 'surface');    //点与模型的距离

float ang =efit(dist, 0.0, chf('rangdsit'), 0, $PI * 2.0) - @Time*5;
float val = sin(ang);

float height = fit11(val, chf('tmin'), chf('tmax'));
float col = fit11(val, 0.0, 1.0);    //col值呈sin函数周期变化

@P += @N * height;    //沿法线偏移

f@dist = dist * col;

8、Ramp斜坡重映射函数/参数

​ 可以看看这篇笔记:
【HoudiniVex笔记_P3_ParameterBase参数基础】的第四部分。 ​

感兴趣可以继续看视频部分【1h7m ~ 1h17m】。

9、重映射与插值/Lerp 

仅截图记录下——>小球从一个形态平滑过渡到另一个形态。

10、Exercise—重映射与插值/Lerp 

上一节是两小球之间的变化过渡。这次是多个小球之间的形态变化过渡。 

仅大概记录下,感兴趣的可以跟做下,

//每个点设置随机大小
i@id = @ptnum;

vector scale = rand(@P);

float min = chf('min');
float max = chf('max');

v@scale = fit01(scale, min, max);
int count = npoints(2);     //第二个输入点总共有几个点

float f = fit(@Frame, 1, $FEND + 1 , 0.0, 1.0);     //当前帧范围映射为0~1,从0递增到1
int i = floor(f * count);                           //i值随时间递增,从0递增count
float ff = (f % (1.0 / count )) * count;            //其意义为,相当于把时间均分给每两个变换点
ff = smooth(0.0, 1.0, ff);
//ff = chramp('ramp', ff);

int npts1[] = findattribval(1, 'point', 'id', i);
int npt1 = npts1[@ptnum];
vector npos1 = point(1, 'P', npt1);

int npts2[] = findattribval(1, 'point', 'id', (i+1) % count);
int npt2 = npts2[@ptnum];
vector npos2 = point(1, 'P', npt2);

@P = lerp(npos1, npos2, ff);

11、重映射与UV

展UV,记录下。

12、 Exercise—重映射与UV

记录下,感兴趣可以跟着做做。

int vtx = pointvertex(0, @ptnum);
vector uv = vertex(0, 'uv', vtx);

float x = chf('x');
float y = chf('y');

//相当于划分成一块块
uv = uv % set(x, y, 1.0);   
uv = fit(uv, set(0,0,0), set(x, y, 0), set(0,0,0), set(1,1,1));
// 也可这样写 uv = uv * set(1/x, 1/y, 1.0);  

uv *= $PI;
float xh = sin(uv.x);
float yh = sin(uv.y);

@P += @N * (xh * yh) * chf('height');
<think>嗯,用户现在问的是如何在重映射之后关闭TIM10的通道4的重映射功能。之前用户已经询问过关于CH32V307VCT6标准库使用默认复用输入功能的问题,现在转向了定时器的重映射关闭。 首先,我需要确认用户对重映射的理解是否正确。可能用户在使用TIM10时,不小心或需要临时重映射了通道4,现在想恢复默认配置。或者可能在调试过程中遇到了问题,想回到初始状态。 接下来,我需要回顾CH32V307VCT6的相关文档,特别是关于定时器重映射的部分。通常,微控制器的重映射功能是通过AFIO(Alternate Function I/O)或类似的模块来控制的。比如,STM32中常用AFIO来管理重映射,但CH32V系列可能有自己的机制。 用户提到的TIM10通道4,可能是指某个特定引脚的重映射。比如,原本TIM10_CH4在某个GPIO上,重映射后换到了另一个GPIO。关闭重映射意味着恢复该通道到默认的引脚。 我需要检查该芯片的参考手册,确认TIM10的重映射控制寄存器。通常,重映射的设置涉及设置某些位在特定的寄存器中,例如AFIO_MAPR或类似的寄存器。关闭重映射可能需要清除这些位,恢复默认值。 此外,用户可能已经启用了重映射,现在需要关闭它,所以需要找到对应的控制位,并对其进行操作。例如,如果重映射是通过设置某个位为1来启用的,那么关闭就是将该位清零。 还需要考虑在关闭重映射后,是否需要重新配置GPIO的模式,比如从复用功能模式切换回默认的输入或输出模式,或者是否需要关闭之前配置的AFIO时钟。 另外,要注意步骤的正确顺序:可能需要先关闭外设(TIM10),然后修改重映射设置,再重新配置GPIO,最后重新初始化外设。否则可能会出现硬件冲突或配置不生效的情况。 用户可能遇到的问题包括:不知道具体的寄存器名称,或者如何访问这些寄存器。在标准库中,通常会有对应的函数或宏来操作重映射,比如使用GPIO_PinRemapConfig()函数,但具体名称可能因库而异。 还需要考虑是否有其他相关配置需要调整,比如中断设置,或者DMA通道是否受到影响。但在用户的问题中,主要关注的是关闭重映射本身,所以可能不需要涉及这些部分。 最后,给出具体的代码示例会更有帮助,比如如何调用库函数来关闭重映射,如何恢复GPIO的默认配置,以及可能的注意事项,比如时钟使能顺序等。</think>以下是关闭TIM10通道4重映射功能的步骤说明: --- ### **1. 理解重映射机制** CH32V307VCT6的重映射功能通过**AFIO(复用功能I/O)模块**控制。重映射后,外设引脚会绑定到新的物理引脚,关闭重映射需恢复默认映射关系。 --- ### **2. 关闭重映射的核心步骤** #### (1) **禁用外设时钟** 在修改重映射前,需先关闭外设时钟以避免冲突: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, DISABLE); // 关闭TIM10时钟 ``` #### (2) **复位重映射寄存器** 通过AFIO相关寄存器清除TIM10通道4的重映射位。假设TIM10_CH4重映射由`AFIO_MAPR`寄存器某位控制: ```c AFIO->MAPR &= ~(1 << n); // 将第n位清零(具体位需查手册) // 或使用库函数(若标准库提供): GPIO_PinRemapConfig(RemapBitValue, DISABLE); // 关闭指定重映射 ``` #### (3) **恢复GPIO默认配置** 将原本被重映射的引脚恢复为默认状态(通常设为浮空输入或复用功能释放): ```c GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_X; // 原重映射后的引脚(如PB4) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入 GPIO_Init(GPIOB, &GPIO_InitStructure); // 假设PB4需恢复 ``` #### (4) **重新使能外设** 恢复默认映射后重新初始化TIM10: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, ENABLE); // 重新使能TIM10时钟 // 重新配置TIM10(根据需要) ``` --- ### **3. 关键注意事项** - **查阅手册**:确认`TIM10_CH4`的重映射控制位(如`AFIO_MAPR_TIM10_REMAP`),不同芯片位定义可能不同。 - **操作顺序**: **禁用时钟 → 清除重映射 → 恢复GPIO → 重新初始化外设** 直接操作寄存器需谨慎,建议优先使用标准库函数(如`GPIO_PinRemapConfig`)。 - **默认引脚**:关闭重映射后,TIM10_CH4会回到默认引脚(如PA4,具体参考数据手册)。 --- ### **4. 示例代码(假设使用库函数)** ```c // 1. 关闭TIM10时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, DISABLE); // 2. 关闭重映射(假设TIM10_CH4重映射由AFIO_MAPR_TIM10_REMAP控制) GPIO_PinRemapConfig(AFIO_MAPR_TIM10_REMAP, DISABLE); // 3. 恢复原重映射引脚为默认状态(例如PB4) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); // 4. 重新使能TIM10并配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10, ENABLE); TIM_Cmd(TIM10, ENABLE); // 根据实际需求初始化TIM10 ``` --- ### **5. 验证方法** - **逻辑分析仪**:检查原默认引脚(如PA4)是否有TIM10_CH4信号输出。 - **寄存器读取**:通过调试工具查看`AFIO_MAPR`寄存器对应位是否已清零。 --- **提示**:若未找到明确的重映射控制位,需结合芯片数据手册和标准库头文件(如`ch32v30x_afio.h`)确认寄存器定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值