如何制作刀子的高低模

1.首先制作刀子的低面数版本和高面数版本,其中低面数版本不要切边和tubosmooth。将低版本的模型导入到UV layout中切坐标。

2.将两种模型重合,使用alt+a进行轴心点的对齐

3.给低面数版本模型添加projection修改器

4.在pick中选择高面数版本的模型

5.在Display Toggle中勾选enable,下拉cage列表,在其的Display栏目中勾上cage与shaded选项,再调节Amount的大小,使得其外轮廓线要在整个模型的外面

6.按0打开纹理编辑器,按存好的图片勾选选项,在OUTPUT栏目中点击add按钮,勾选NormalMap,大小选择2048*2048的分辨率。

7.将render完成的三张使用ps合成到一张图中,在图中选择alpha通道,将UV纹理之外的背景部分去掉。

8.在SP中将这张图作为资源图导入进项目中,同时将底版本数模型导入到项目内,新增NORMAL通道,将这张图放入NOMAL通道内

哲学家进餐问题是一个经典的并发编程问题,它描述了五个哲学家围坐在一张圆桌前吃饭的情景。每个哲学家面前有一只碗和一对筷子。碗里有米饭,但是筷子只有一半,也就是说每个哲学家只有左右两只筷子各一只。当一个哲学家想要吃饭时,他必须先拿起自己的左右两只筷子,才能够开始吃饭。吃完饭之后,他需要把筷子放回原位,然后才能继续思考问题。假设每个哲学家都采用以下算法: ```c while (1) { think(); //思考问题 pickup(); //拿起筷子 eat(); //吃饭 putdown(); //放下筷子 } ``` 其中,pickup() 和 putdown() 函数用来拿起和放下筷子。 为了避免死锁,需要引入一个额外的限制条件:只有当一个哲学家两边的筷子都可用时,他才能拿起筷子。这也就意味着,如果所有的哲学家都同时拿起了自己左边的筷子,那么他们会陷入死锁,因为每个人都在等待右边的筷子。为了避免这种情况,可以采用以下方法: 1. 筷子编号:将每个筷子都进行编号,从 1 到 5。 2. 偶数哲学家先拿右边的筷子,再拿左边的筷子;奇数哲学家先拿左边的筷子,再拿右边的筷子。 3. 引入一个额外的限制条件:当一个哲学家拿起了左边的筷子,但是右边的筷子已经被其他哲学家拿走时,他必须放下左边的筷子,等待右边的筷子。 以下是一个简单的 C 语言实现: ```c #include <pthread.h> #include <stdio.h> #define N 5 #define LEFT(i) ((i) + N - 1) % N #define RIGHT(i) ((i) + 1) % N #define THINKING 0 #define HUNGRY 1 #define EATING 2 int state[N]; pthread_mutex_t mutex; pthread_cond_t cond[N]; void test(int i) { if (state[i] == HUNGRY && state[LEFT(i)] != EATING && state[RIGHT(i)] != EATING) { state[i] = EATING; pthread_cond_signal(&cond[i]); } } void pickup(int i) { pthread_mutex_lock(&mutex); state[i] = HUNGRY; test(i); while (state[i] != EATING) pthread_cond_wait(&cond[i], &mutex); pthread_mutex_unlock(&mutex); } void putdown(int i) { pthread_mutex_lock(&mutex); state[i] = THINKING; test(LEFT(i)); test(RIGHT(i)); pthread_mutex_unlock(&mutex); } void think() { printf("Philosopher is thinking...\n"); } void eat() { printf("Philosopher is eating...\n"); } void *philosopher(void *arg) { int i = *(int *)arg; while (1) { think(); pickup(i); eat(); putdown(i); } } int main() { int i; pthread_t tid[N]; int id[N]; pthread_mutex_init(&mutex, NULL); for (i = 0; i < N; i++) { state[i] = THINKING; pthread_cond_init(&cond[i], NULL); id[i] = i; pthread_create(&tid[i], NULL, philosopher, &id[i]); } for (i = 0; i < N; i++) pthread_join(tid[i], NULL); return 0; } ``` 在这个实现中,每个哲学家的状态由 state 数组来记录,0 表示思考,1 表示饥饿,2 表示就餐。pickup() 和 putdown() 函数分别用来拿起和放下筷子,并且在操作之前需要先获取互斥锁 mutex。test() 函数用来检查是否可以开始就餐。当一个哲学家拿起了两只筷子之后,他就可以开始就餐了,同时需要唤醒其他可能在等待这个筷子的哲学家。当一个哲学家放下筷子之后,也需要检查其他哲学家是否可以开始就餐,同时也需要释放互斥锁 mutex。 最后,在 main() 函数中创建 5 个线程,每个线程代表一个哲学家。在每个线程中循环执行 think()、pickup()、eat() 和 putdown() 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值