C4D
1. 远近景深问题
先创建所需要的模型与摄像机,然后创建一个空白模型,并将空白模型的中心与所要突出的模型重合,该模型为空白模型的子级。点击摄像机设置,选择物理模式并勾选景深。点击摄像机,并将空白放入焦点对象中,选择物理并将光圈的数值减小(光圈越小越模糊,即景深越深)。然后进行渲染则可得到结果。
2. 摄像机的使用
-
摄像机
给场景添加灯光之前,需要建立摄像机(位于上方工具栏)
点击大纲栏摄像机后面的方框,表示进入摄像机
画框尺寸的设置:渲染设置—输出—自定义尺寸即为摄像机的尺寸
进入摄像机,适当调节摄像机角度,即可在当前角度打光和进行其他设置 -
摄像机类型:
(1)基础:常用于K画面
(2)目标:常用于K画面,大纲栏摄像机后面多一个目标表达式的标志(类似于目标聚光灯中的空白,可通过调节目标调节角度)
(3)立体
(4)运动:进入摄像机—点击播放→有轻微晃动的效果,即模拟手持摄像机的效果
(5)摇臂:模拟摄像机被吊起后朝向某个方向,进入摄像机后可调节云台的高度、朝向、吊臂的长度、高度—退出摄像机,可调节整个摄像机的位置 -
模型
PS海报制作
(自我感觉良好之后做梦爱奇艺大大捞我海报,然鹅…来自父亲大人的直接了当的回复)
于是再附上本来综艺的海报图,产生鲜明的效果
HTML的学习
刚涉及然后在菜鸟教程学习基础的知识。
< map >定义图像地图
< map name = " plantemap" >
<area shape = "rect" corrds = " 0,0,82,126" alt="sun" href = " sun.htm " >
area------定义可点击区域
shape----点击区域的形状
corrds----链接区域在图片中的坐标
- 矩形 ------ “rect”
< area shape = " rect " corrds = "x1,y1,x2,y2" href = url >
x1,y2为左上顶点的坐标,x2,y2为右上顶点的坐标- 圆形 ------ " circle "
< area shape = " circle " corrds = "x1,y1,r" href = url >
x1,y1为圆心的坐标,r为圆的半径- 多边形 ------ " poly "
area shape = " poly " corrds = "x1,y1,x2,y2......" href = url >
x1,y1,x2,y2…分别为各顶点的坐标
表格的标签
标签 | 描述 |
---|---|
< table > | 定义表格 |
< th > | 定义表格的表头 |
< tr > | 定义表格的行 |
< td > | 定义表格单元 |
< caption > | 定义表格标题 |
< colgroup > | 定义表格列的组 |
< col > | 定义用于表格列的属性 |
< thead > | 定义表格的页眉 |
< tbody > | 定义表格的主体 |
< tfoot > | 定义表格的页脚 |
HTML中的table可以大致分为三个部分:
- thead ---------表格的页眉
- tbody ---------表格的主体
- tfoot ---------定义表格的页脚
thead, tbody, tfoot 相当于三间房子,每间房子都可以用来放东西。
< tr > < /tr > 这个标签就是放在三间房子里面的东西,每一个 < tr > < /tr > 就是表格一行。
表格的每一行被分为一个个单元格。
每一个单元格就是用来存放数据的,这个数据分为两种:一,数据的名称;二,数据本身。
用 < th >< /th > 表示数据的名称(标题) ,
< td >< /td >
表示真正的数据内容。
一个简单实例:
C语言
指针数组和数组指针
-
指针数组 -------即指针的数组(含有指针的数组)
首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称,即每个元素都是指针。指针数组是多个指针变量,以数组的形式存储在内存中,占有多个指针的存储空间。
int * pt[4]
“[]”的优先级比“”要高。pt 先与“[]”结合,构成一个数组的定义,数组名为pt,int 修饰的是数组的内容,即数组的每个元素.因此这是一个数组,其包含4 个指向int 类型数据的指针,即指针数组。
int main()
{
int a = 1;
int b = 2;
int *p[2];
p[0] = &a;
p[1] = &b;
printf("%p\n", p[0]); //a的地址
printf("%p\n", &a); //a的地址
printf("%p\n", p[1]); //b的地址
printf("%p\n", &b); //b的地址
printf("%d\n", *p[0]); //p[0]表示a的地址,则*p[0]表示a的值
printf("%d\n", *p[1]); //p[1]表示b的地址,则*p[1]表示b的值
//将二维数组赋给指针数组
int *pp[3]; //一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],所以要分别赋值
int c[3][4];
for (int i = 0; i<3; i++)
pp[i] = c[i];
int k;
scanf("%d", &k);
return 0;
}
1.1指针数组在参数传递时的使用
指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,一个这是指针数组用来接收每个参数(字符串)的地址
int main(int argc, char *argv[])
此时可以想象内存映像图,主函数的栈区有一个叫argv的数组,这个数组的元素是你输入的参数的地址,指向着只读数据区。
如果是向子函数传参,这和传递一个普通数组的思想一样,不能传递整个数组过去,如果数组很大,这样内存利用率很低,所以应该传递数组的首地址,用一个指针接收这个地址。因此,指针数组对应着二级指针
void fun(char **pp);//子函数中的形参
fun(char *p[]);//主函数中的实参
1.2指针数组的排序
指针数组的排序非常有趣,因为这个数组中存放的是指针,通过比较指针指向的空间的大小,排序这些空间的地址。函数实现如下:
void sort(char **pa, int n)//冒泡排序
{
int i, j;
char *tmp = NULL;
for(i = 0; i < n-1; i++){
for(j = 0; j < n-1-i; j++){
if((strcmp(*pa+j), *(pa+j+1)) > 0){
tmp = *(pa + j);
*(pa + j) = *(pa + j + 1);
*(pa + j + 1) = tmp;
}
}
}
}
在函数中定义指针数组,并且打印结果如下:
char *pa[4] = {"abc", "xyz", "opq", "xyz"};
[root@menwen-linux test]# ./test
abc
ijk
opq
xyz
2.数组指针--------数组的指针(指向数组的指针)
首先它是一个指针,它指向一个数组,即指向数组的指针;在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。数组指针指向的是数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关。
int ( * pt )[4]
“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。因此p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针 .
int main()
{
//一维数组
int a[5] = { 1, 2, 3, 4, 5 };
//步长为5的数组指针,即数组里有5个元素
int (*p)[5];
//把数组a的地址赋给p,则p为数组a的地址,则*p表示数组a本身
p = &a;
//%p输出地址, %d输出十进制
//\n回车
//在C中,在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型。
printf("%p\n", a); //输出数组名,一般用数组的首元素地址来标识一个数组,则输出数组首元素地址
printf("%p\n", p); //根据上面,p为数组a的地址,输出数组a的地址
printf("%p\n", *p); //*p表示数组a本身,一般用数组的首元素地址来标识一个数组
printf("%p\n", &a[0]); //a[0]的地址
printf("%p\n", &a[1]); //a[1]的地址
printf("%p\n", p[0]); //数组首元素的地址
printf("%d\n", **p); //*p为数组a本身,即为数组a首元素地址,则*(*p)为值,当*p为数组首元素地址时,**p表示首元素的值1
printf("%d\n", *p[0]); //根据优先级,p[0] 表示首元素地址,则*p[0]表示首元素本身,即首元素的值1
printf("%d\n", *p[1]); //为一个绝对值很大的负数,不表示a[1]...表示什么我还不知道
//将二维数组赋给指针
int b[3][4];
int(*pp)[4]; //定义一个数组指针,指向含4个元素的一维数组
pp = b; //将该二维数组的首地址赋给pp,也就是b[0]或&b[0],二维数组中pp=b和pp=&b[0]是等价的
pp++; //pp=pp+1,该语句执行过后pp的指向从行b[0][]变为了行b[1][],pp=&b[1]
int k;
scanf("%d", &k);
return 0;
}
2.1 数组指针传参时的使用
数组指针既然是一个指针,那么就是用来接收地址,在传参时就接收数组的地址,所以数组指针对应的是二维数组。
void fun(int (*P)[4]);//子函数中的形参,指针数组
a[3][4] = {0};//主函数中定义的二维数组
fun(a);//主函数调用子函数的实参,是二维数组的首元素首地址
2.2利用数组指针遍历数组
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 1, 3, 5, 7, 9};
int len = sizeof(arr) / sizeof(int); //求数组长度
int i, *p = arr;
for(i=0; i<len; i++)
{
printf("%d ", *(p+i) );
}
printf("\n");
return 0;
}
数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof( p ) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof( p ) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。
根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。不像字符串,数组本身也没有特定的结束标志,如果不知道数组的长度,那么就无法遍历整个数组。
对指针变量进行加法和减法运算时,是根据数据类型的长度来计算的。如果一个指针变量 p 指向了数组的开头,那么 p+i 就指向数组的第 i 个元素;如果 p 指向了数组的第 n 个元素,那么 p+i 就是指向第 n+i 个元素;而不管 p 指向了数组的第几个元素,p+1 总是指向下一个元素,p-1 也总是指向上一个元素
更改上面的代码,让 p 指向数组中的第二个元素:
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 1, 3, 5, 7, 9};
int *p = &arr[2]; //也可以写作 int *p = arr + 2;
printf("%d, %d, %d, %d, %d\n", *(p-2), *(p-1), *p, *(p+1), *(p+2) );
return 0;
}