You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
1 月之前
2 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  1. # 材质 API 🌎
  2. 在真实世界里,每个物体会对光产生不同的反应。钢看起来比陶瓷花瓶更闪闪发光,一个木头箱子不会像钢箱子一样对光产生很强的反射。每个物体对镜面高光也有不同的反应。有些物体不会散射(
  3. Scatter)很多光却会反射(Reflect)很多光,结果看起来就有一个较小的高光点(Highlight),有些物体散射了很多,它们就会产生一个半径更大的高光。如果我们想要在
  4. OpenGL 中模拟多种类型的物体,我们必须为每个物体分别定义材质(Material)属性。
  5. ## DC.ColorMaterialProperty
  6. > 颜色材质
  7. ### example
  8. ```js
  9. let material = new DC.ColorMaterialProperty(DC.Color.RED)
  10. ```
  11. ### creation
  12. - **_constructor(color)_**
  13. 构造函数
  14. - 参数
  15. - `{DC.Color} color`:颜色
  16. - 返回值 `material`
  17. ## DC.ImageMaterialProperty
  18. > 图片材质
  19. ### example
  20. ```js
  21. let material = new DC.ImageMaterialProperty({
  22. image: '**/**.png',
  23. transparent: true,
  24. })
  25. ```
  26. ### creation
  27. - **_constructor([options])_**
  28. 构造函数
  29. - 参数
  30. - `{Object} options`:属性
  31. - 返回值 `material`
  32. ```js
  33. // options(属性可选)
  34. const options = {
  35. "image": "", // 图片地址
  36. "repeat": { "x": 1, "y": 1 }, // 图片重复
  37. "color": DC.Color.WHITE, // 图片颜色
  38. "transparent": false // 材质是否透明
  39. }
  40. ```
  41. ### properties
  42. - `{String} image`:图片地址
  43. - `{Object} repeat`:图片重复
  44. - `{DC.Color} color`:图片颜色
  45. - `{Boolean} transparent`:材质是否透明
  46. ## DC.CircleBlurMaterialProperty
  47. > 模糊圆材质
  48. ### example
  49. ```js
  50. let material = new DC.CircleBlurMaterialProperty({
  51. color: DC.Color.WHITE,
  52. })
  53. ```
  54. ### creation
  55. - **_constructor([options])_**
  56. 构造函数
  57. - 参数
  58. - `{Object} options`:属性
  59. - 返回值 `materialProperty`
  60. ```js
  61. // options(属性可选)
  62. const options = {
  63. "color": DC.Color.WHITE, // 颜色
  64. "speed": 10 // 速度
  65. }
  66. ```
  67. ### properties
  68. - `{DC.Color} color`:颜色
  69. - `{Number} speed`:速度
  70. ## DC.CircleDiffuseMaterialProperty
  71. > 扩散圆材质
  72. ### example
  73. ```js
  74. let material = new DC.CircleDiffuseMaterialProperty({
  75. color: DC.Color.WHITE,
  76. })
  77. ```
  78. ### creation
  79. - **_constructor([options])_**
  80. 构造函数
  81. - 参数
  82. - `{Object} options`:属性
  83. - 返回值 `materialProperty`
  84. ```js
  85. // options(属性可选)
  86. const options = {
  87. "color": DC.Color.WHITE, // 颜色
  88. "speed": 10// 速度
  89. }
  90. ```
  91. ### properties
  92. - `{DC.Color} color`:颜色
  93. - `{Number} speed`:速度
  94. ## DC.CircleFadeMaterialProperty
  95. > 逐渐消逝圆材质
  96. ### example
  97. ```js
  98. let material = new DC.CircleFadeMaterialProperty({
  99. color: DC.Color.WHITE,
  100. })
  101. ```
  102. ### creation
  103. - **_constructor([options])_**
  104. 构造函数
  105. - 参数
  106. - `{Object} options`:属性
  107. - 返回值 `materialProperty`
  108. ```js
  109. // options(属性可选)
  110. const options = {
  111. "color": DC.Color.WHITE,// 颜色
  112. "speed": 10// 速度
  113. }
  114. ```
  115. ### properties
  116. - `{DC.Color} color`:颜色
  117. - `{Number} speed`:速度
  118. ## DC.CirclePulseMaterialProperty
  119. > 脉冲圆材质
  120. ### example
  121. ```js
  122. let material = new DC.CirclePulseMaterialProperty({
  123. color: DC.Color.WHITE,
  124. })
  125. ```
  126. ### creation
  127. - **_constructor([options])_**
  128. 构造函数
  129. - 参数
  130. - `{Object} options`:属性
  131. - 返回值 `materialProperty`
  132. ```js
  133. // options(属性可选)
  134. const options = {
  135. "color": DC.Color.WHITE, // 颜色
  136. "speed": 10// 速度
  137. }
  138. ```
  139. ### properties
  140. - `{DC.Color} color`:颜色
  141. - `{Number} speed`:速度
  142. ## DC.CircleScanMaterialProperty
  143. > 扫描圆材质
  144. ### example
  145. ```js
  146. let material = new DC.CircleScanMaterialProperty({
  147. color: DC.Color.WHITE,
  148. })
  149. ```
  150. ### creation
  151. - **_constructor([options])_**
  152. 构造函数
  153. - 参数
  154. - `{Object} options`:属性
  155. - 返回值 `materialProperty`
  156. ```js
  157. // options(属性可选)
  158. const options = {
  159. "color": DC.Color.WHITE,// 颜色
  160. "speed": 10// 速度
  161. }
  162. ```
  163. ### properties
  164. - `{DC.Color} color`:颜色
  165. - `{Number} speed`:速度
  166. ## DC.CircleSpiralMaterialProperty
  167. > 螺旋圆材质
  168. ### example
  169. ```js
  170. let material = new DC.CircleSpiralMaterialProperty({
  171. color: DC.Color.WHITE,
  172. })
  173. ```
  174. ### creation
  175. - **_constructor([options])_**
  176. 构造函数
  177. - 参数
  178. - `{Object} options`:属性
  179. - 返回值 `materialProperty`
  180. ```js
  181. // options(属性可选)
  182. const options = {
  183. "color": DC.Color.WHITE,// 颜色
  184. "speed": 10 // 速度
  185. }
  186. ```
  187. ### properties
  188. - `{DC.Color} color`:颜色
  189. - `{Number} speed`:速度
  190. ## DC.CircleVaryMaterialProperty
  191. > 多彩圆材质
  192. ### example
  193. ```js
  194. let material = new DC.CircleVaryMaterialProperty({
  195. color: DC.Color.WHITE,
  196. })
  197. ```
  198. ### creation
  199. - **_constructor([options])_**
  200. 构造函数
  201. - 参数
  202. - `{Object} options`:属性
  203. - 返回值 `materialProperty`
  204. ```js
  205. // options(属性可选)
  206. const options = {
  207. "color": DC.Color.WHITE,// 颜色
  208. "speed": 10// 速度
  209. }
  210. ```
  211. ### properties
  212. - `{DC.Color} color`:颜色
  213. - `{Number} speed`:速度
  214. ## DC.CircleWaveMaterialProperty
  215. > 波纹圆材质
  216. ### example
  217. ```js
  218. let material = new DC.CircleWaveMaterialProperty({
  219. color: DC.Color.WHITE,
  220. })
  221. ```
  222. ### creation
  223. - **_constructor([options])_**
  224. 构造函数
  225. - 参数
  226. - `{Object} options`:属性
  227. - 返回值 `materialProperty`
  228. ```js
  229. // options(属性可选)
  230. const options = {
  231. "color": DC.Color.WHITE,// 颜色
  232. "speed": 10, // 速度
  233. "count": 5, //数量
  234. "gradient": 0.1 //强度
  235. }
  236. ```
  237. ### properties
  238. - `{Color} color`:颜色
  239. - `{Number} speed`:速度
  240. - `{Number} count`:数量
  241. - `{Number} gradient`:强度
  242. ## DC.EllipsoidElectricMaterialProperty
  243. > 电弧球材质
  244. ### example
  245. ```js
  246. let material = new DC.EllipsoidElectricMaterialProperty({
  247. color: DC.Color.WHITE,
  248. })
  249. ```
  250. ### creation
  251. - **_constructor([options])_**
  252. 构造函数
  253. - 参数
  254. - `{Object} options`:属性
  255. - 返回值 `materialProperty`
  256. ```js
  257. // options(属性可选)
  258. const options = {
  259. "color": DC.Color.WHITE,// 颜色
  260. "speed": 10 // 速度
  261. }
  262. ```
  263. ### properties
  264. - `{DC.Color} color`:颜色
  265. - `{Number} speed`:速度
  266. ## DC.EllipsoidTrailMaterialProperty
  267. > 轨迹球材质
  268. ### example
  269. ```js
  270. let material = new DC.EllipsoidTrailMaterialProperty({
  271. color: DC.Color.WHITE,
  272. })
  273. ```
  274. ### creation
  275. - **_constructor([options])_**
  276. 构造函数
  277. - 参数
  278. - `{Object} options`:属性
  279. - 返回值 `materialProperty`
  280. ```js
  281. // options(属性可选)
  282. const options = {
  283. "color": DC.Color.WHITE, // 颜色
  284. "speed": 10 // 速度
  285. }
  286. ```
  287. ### properties
  288. - `{DC.Color} color`:颜色
  289. - `{Number} speed`:速度
  290. ## DC.PolylineDashMaterialProperty
  291. > 虚线材质
  292. ### example
  293. ```js
  294. let material = new DC.PolylineDashMaterialProperty({
  295. color: DC.Color.WHITE,
  296. })
  297. ```
  298. ### creation
  299. - **_constructor([options])_**
  300. 构造函数
  301. - 参数
  302. - `{Object} options`:属性
  303. - 返回值 `materialProperty`
  304. ```js
  305. // options(属性可选)
  306. const options = {
  307. "color": DC.Color.WHITE,// 虚线颜色
  308. "gapColor": DC.Color.TRANSPARENT,// 间隔颜色
  309. "dashLength": 16.0// 虚线片段长度
  310. }
  311. ```
  312. ### properties
  313. - `{DC.Color} color`:虚线颜色
  314. - `{DC.Color} gapColor`:间隔颜色
  315. - `{Number} dashLength`:虚线片段长度
  316. ## DC.PolylineArrowMaterialProperty
  317. > 箭头材质
  318. ### example
  319. ```js
  320. let material = new DC.PolylineArrowMaterialProperty(DC.Color.WHITE)
  321. ```
  322. ### creation
  323. - **_constructor(color)_**
  324. 构造函数
  325. - 参数
  326. - `{DC.Color} color`:箭头颜色
  327. - 返回值 `materialProperty`
  328. ### properties
  329. - `{DC.Color} color`:箭头颜色
  330. ## DC.PolylineOutlineMaterialProperty
  331. > 边线材质
  332. ### example
  333. ```js
  334. let material = new DC.PolylineOutlineMaterialProperty({
  335. color: DC.Color.WHITE,
  336. outlineColor: DC.Color.BLACK,
  337. })
  338. ```
  339. ### creation
  340. - **_constructor([options])_**
  341. 构造函数
  342. - 参数
  343. - `{Object} options`:属性
  344. - 返回值 `materialProperty`
  345. ```js
  346. // options(属性可选)
  347. const options = {
  348. "color": DC.Color.WHITE,// 颜色
  349. "outlineColor": DC.Color.BLACK,// 边线颜色
  350. "outlineWidth": 1// 边线宽度
  351. }
  352. ```
  353. ### properties
  354. - `{DC.Color} color`:颜色
  355. - `{DC.Color} outlineColor`:边线颜色
  356. - `{Number} outlineWidth`:边线宽度
  357. ## DC.PolylineGlowMaterialProperty
  358. > 光晕材质
  359. ### example
  360. ```js
  361. let material = new DC.PolylineGlowMaterialProperty({
  362. color: DC.Color.WHITE,
  363. glowPower: 0.25,
  364. })
  365. ```
  366. ### creation
  367. - **_constructor([options])_**
  368. 构造函数
  369. - 参数
  370. - `{Object} options`:属性
  371. - 返回值 `materialProperty`
  372. ```js
  373. // options(属性可选)
  374. const options = {
  375. "color": DC.Color.WHITE,// 颜色
  376. "glowPower": 0.25,// 发光强度,以总线宽的百分比表示
  377. "taperPower": 1 // 渐缩效果的强度
  378. }
  379. ```
  380. ### properties
  381. - `{DC.Color} color`:颜色
  382. - `{Number} glowPower`:发光强度
  383. - `{Number} taperPower`:渐缩效果的强度
  384. ## DC.PolylineFlickerMaterialProperty
  385. > 闪烁线材质
  386. ### example
  387. ```js
  388. let material = new DC.PolylineFlickerMaterialProperty({
  389. color: DC.Color.WHITE,
  390. })
  391. ```
  392. ### creation
  393. - **_constructor([options])_**
  394. 构造函数
  395. - 参数
  396. - `{Object} options`:属性
  397. - 返回值 `materialProperty`
  398. ```js
  399. // options(属性可选)
  400. const options = {
  401. "color": DC.Color.WHITE,// 颜色
  402. "speed": 10 // 速度
  403. }
  404. ```
  405. ### properties
  406. - `{DC.Color} color`:颜色
  407. - `{Number} speed`:速度
  408. ## DC.PolylineFlowMaterialProperty
  409. > 流动线材质
  410. ### example
  411. ```js
  412. let material = new DC.PolylineFlowMaterialProperty({
  413. color: DC.Color.WHITE,
  414. })
  415. ```
  416. ### creation
  417. - **_constructor([options])_**
  418. 构造函数
  419. - 参数
  420. - `{Object} options`:属性
  421. - 返回值 `materialProperty`
  422. ```js
  423. // options(属性可选)
  424. const options = {
  425. "color": DC.Color.WHITE,// 颜色
  426. "speed": 10, // 速度,
  427. "percent": 0.3,// 比例
  428. "gradient": 0.1 // 透明程度
  429. }
  430. ```
  431. ### properties
  432. - `{DC.Color} color`:颜色
  433. - `{Number} speed`:速度
  434. - `{Number} percent`:比例,
  435. - `{Number} gradient`:透明程度,
  436. ## DC.PolylineImageTrailMaterialProperty
  437. > 图片轨迹线材质
  438. ### example
  439. ```js
  440. let material = new DC.PolylineImageTrailMaterialProperty({
  441. color: DC.Color.WHITE,
  442. image: '**/*.png',
  443. repeat: { x: 10, y: 1 },
  444. })
  445. ```
  446. ### creation
  447. - **_constructor([options])_**
  448. 构造函数
  449. - 参数
  450. - `{Object} options`:属性
  451. - 返回值 `materialProperty`
  452. ```js
  453. // options(属性可选)
  454. const options = {
  455. "color": DC.Color.WHITE,// 颜色
  456. "speed": 10,// 速度
  457. "image": "**/*.png",// 图片地址
  458. "repeat": {
  459. "x": 10,
  460. "y": 1
  461. } //重复规则
  462. }
  463. ```
  464. ### properties
  465. - `{DC.Color} color`:颜色
  466. - `{Number} speed`:速度
  467. - `{String} image`:图片地址
  468. - `{Object} repeat`:重复规则
  469. ## DC.PolylineLightingMaterialProperty
  470. > 发光线材质
  471. ### example
  472. ```js
  473. let material = new DC.PolylineLightingMaterialProperty({
  474. color: DC.Color.WHITE,
  475. })
  476. ```
  477. ### creation
  478. - **_constructor([options])_**
  479. 构造函数
  480. - 参数
  481. - `{Object} options`:属性
  482. - 返回值 `materialProperty`
  483. ```js
  484. // options(属性可选)
  485. const options = {
  486. "color": DC.Color.WHITE // 颜色
  487. }
  488. ```
  489. ### properties
  490. - `{DC.Color} color`:颜色
  491. ## DC.PolylineLightingTrailMaterialProperty
  492. > 颜色轨迹线材质
  493. ### example
  494. ```js
  495. let material = new DC.PolylineLightingTrailMaterialProperty({
  496. color: DC.Color.WHITE,
  497. })
  498. ```
  499. ### creation
  500. - **_constructor([options])_**
  501. 构造函数
  502. - 参数
  503. - `{Object} options`:属性
  504. - 返回值 `materialProperty`
  505. ```js
  506. // options(属性可选)
  507. const options = {
  508. "color": DC.Color.WHITE,// 颜色
  509. "speed": 10// 速度
  510. }
  511. ```
  512. ### properties
  513. - `{DC.Color} color`:颜色
  514. - `{Number} speed`:速度
  515. ## DC.PolylineTrailMaterialProperty
  516. > 颜色轨迹线材质
  517. ### example
  518. ```js
  519. let material = new DC.PolylineTrailMaterialProperty({
  520. color: DC.Color.WHITE,
  521. })
  522. ```
  523. ### creation
  524. - **_constructor([options])_**
  525. 构造函数
  526. - 参数
  527. - `{Object} options`:属性
  528. - 返回值 `materialProperty`
  529. ```js
  530. // options(属性可选)
  531. const options = {
  532. "color": DC.Color.WHITE,// 颜色
  533. "speed": 10 // 速度
  534. }
  535. ```
  536. ### properties
  537. - `{DC.Color} color`:颜色
  538. - `{Number} speed`:速度
  539. ## DC.RadarLineMaterialProperty
  540. > 雷达线材质
  541. ### example
  542. ```js
  543. let material = new DC.RadarLineMaterialProperty({
  544. color: DC.Color.WHITE,
  545. })
  546. ```
  547. ### creation
  548. - **_constructor([options])_**
  549. 构造函数
  550. - 参数
  551. - `{Object} options`:属性
  552. - 返回值 `materialProperty`
  553. ```js
  554. // options(属性可选)
  555. const options = {
  556. "color": DC.Color.WHITE,// 颜色
  557. "speed": 10// 速度
  558. }
  559. ```
  560. ### properties
  561. - `{DC.Color} color`:颜色
  562. - `{Number} speed`:速度
  563. ## DC.RadarWaveMaterialProperty
  564. > 波纹雷达材质
  565. ### example
  566. ```js
  567. let material = new DC.RadarWaveMaterialProperty({
  568. color: DC.Color.WHITE,
  569. })
  570. ```
  571. ### creation
  572. - **_constructor([options])_**
  573. 构造函数
  574. - 参数
  575. - `{Object} options`:属性
  576. - 返回值 `materialProperty`
  577. ```js
  578. // options(属性可选)
  579. const options = {
  580. "color": DC.Color.WHITE,// 颜色
  581. "speed": 10// 速度
  582. }
  583. ```
  584. ### properties
  585. - `{DC.Color} color`:颜色
  586. - `{Number} speed`:速度
  587. ## DC.WallImageTrailMaterialProperty
  588. > 图片轨迹墙体材质
  589. ### example
  590. ```js
  591. let material = new DC.WallImageTrailMaterialProperty({
  592. color: DC.Color.WHITE,
  593. image: '**/*.png',
  594. repeat: { x: 10, y: 1 },
  595. })
  596. ```
  597. ### creation
  598. - **_constructor([options])_**
  599. 构造函数
  600. - 参数
  601. - `{Object} options`:属性
  602. - 返回值 `materialProperty`
  603. ```js
  604. // options(属性可选)
  605. const options = {
  606. "color": DC.Color.WHITE,// 颜色
  607. "speed": 10,// 速度
  608. "image": "**/*.png",// 图片地址
  609. "repeat": {
  610. "x": 10,
  611. "y": 1
  612. } //重复规则
  613. }
  614. ```
  615. ### properties
  616. - `{DC.Color} color`:颜色
  617. - `{Number} speed`:速度
  618. - `{String} image`:图片地址
  619. - `{Object} repeat`:重复规则
  620. ## DC.WallTrailMaterialProperty
  621. > 流动墙材质
  622. ### example
  623. ```js
  624. let material = new DC.WallTrailMaterialProperty({
  625. color: DC.Color.WHITE,
  626. })
  627. ```
  628. ### creation
  629. - **_constructor([options])_**
  630. 构造函数
  631. - 参数
  632. - `{Object} options`:属性
  633. - 返回值 `materialProperty`
  634. ```js
  635. // options(属性可选)
  636. const options = {
  637. "color": DC.Color.WHITE, // 颜色
  638. "speed": 10// 速度
  639. }
  640. ```
  641. ### properties
  642. - `{DC.Color} color`:颜色
  643. - `{Number} speed`:速度
  644. ## DC.WaterMaterialProperty
  645. > 流动水材质
  646. ### example
  647. ```js
  648. let material = new DC.WaterMaterialProperty({
  649. baseWaterColor: DC.Color.WHITE,
  650. normalMap: '**/**.png',
  651. })
  652. ```
  653. ### creation
  654. - **_constructor([options])_**
  655. 构造函数
  656. - 参数
  657. - `{Object} options`:属性
  658. - 返回值 `materialProperty`
  659. ```js
  660. // options(属性可选)
  661. const options = {
  662. "baseWaterColor": DC.Color.WHITE,// 水体颜色
  663. "blendColor": DC.Color.WHITE,// 混合颜色
  664. "specularMap": "",// 镜面图
  665. "normalMap": "", // 法线图
  666. "frequency": 1000, //波纹数量
  667. "animationSpeed": 0.03, // 动画速度
  668. "amplitude": 10, //水波振幅
  669. "specularIntensity": 10 //镜面反射强度
  670. }
  671. ```
  672. ### properties
  673. - `{DC.Color} baseWaterColor`:颜色
  674. - `{DC.Color} blendColor`:混合颜色
  675. - `{String} normalMap`:法线图
  676. - `{String} specularMap`:镜面图