关键词搜索

源码搜索 ×
×

计算机图形学&Web前端笔记-浏览器中心点转场景坐标理论及实现(two.js)

发布2020-07-11浏览965次

详情内容

实现的功能是这样的:

输入window.mainPage.flyTo(xxx, xxx)

后会在浏览器中心点画个圆心,使用鼠标及滚轮滚动后。

再次运行:

前一篇博文已经说了3*3变化矩阵实现图形放缩及平移,这里不再多谈,此处只记录下,将屏幕中心点坐标,转换为two.js的场景坐标点:

这里的two.scene._matrix就是3*3的矩阵。

cirX = (屏幕坐标X点 - 水平位移)/ 水平缩放

cirY = (屏幕坐标Y点 - 垂直位移)/ 垂直缩放

 

源码如下:

  1. ;
  2. import * as Two from "JS/two";
  3. import * as $ from "JS/jquery";
  4. let two;
  5. let mouse;
  6. let isPressed = false;
  7. let originalPositionX = 0;
  8. let originalPositionY = 0;
  9. let map = new Map();
  10. let rect;
  11. export function drawGraphic(){
  12. let elem = document.getElementById("draw-shapes");
  13. let params = {
  14. type: Two.Types['webgl'],
  15. fullscreen: true,
  16. autostart: true
  17. };
  18. two = new Two(params).appendTo(elem);
  19. mouse = new Two.ZUI(two.scene);
  20. mouse.addLimits(0.1, 10);
  21. let $stage = $(two.renderer.domElement);
  22. $stage.bind('mousewheel wheel', function(event){
  23. let e = event.originalEvent;
  24. e.stopPropagation();
  25. e.preventDefault();
  26. let dy = (e.wheelDeltaY || -e.deltaY) / 1000;
  27. mouse.zoomBy(dy, e.clientX, e.clientY);
  28. });
  29. $stage.bind('mouseup', function(event){
  30. isPressed = false;
  31. });
  32. $stage.bind('mouseout', function(event){
  33. isPressed = false;
  34. });
  35. $stage.bind('mousedown', function(event){
  36. isPressed = true;
  37. originalPositionX = event.clientX;
  38. originalPositionY = event.clientY;
  39. let x = event.clientX;
  40. let y = event.clientY;
  41. for(let value of map){
  42. let xOffset = value[0]._width / 2;
  43. let yOffset = value[0]._height / 2;
  44. let letX = ((value[0]._translation._x - xOffset) * (two.scene._matrix.elements[0]) + two.scene._matrix.elements[2]);
  45. let letY = ((value[0]._translation._y - yOffset) * (two.scene._matrix.elements[4]) + two.scene._matrix.elements[5]);
  46. let letWidth = value[0]._width * two.scene._matrix.elements[0];
  47. let letHeight = value[0]._height * two.scene._matrix.elements[4];
  48. if(x > letX &&
  49. y > letY &&
  50. x < letX + letWidth &&
  51. y < letY + letHeight
  52. ){
  53. let r = Math.round(Math.random() * 255);
  54. let g = Math.round(Math.random() * 255);
  55. let b = Math.round(Math.random() * 255);
  56. let rgbStr = "rgb(" + r + "," + g + "," + b + ")";
  57. value[0].fill = rgbStr;
  58. break;
  59. }
  60. }
  61. });
  62. $stage.bind('mousemove', function(event){
  63. if(isPressed){
  64. let boolX = event.clientX - originalPositionX;
  65. let boolY = event.clientY - originalPositionY;
  66. mouse.graphicMove(boolX, boolY);
  67. originalPositionX = event.clientX;
  68. originalPositionY = event.clientY;
  69. }
  70. });
  71. createBtn(1001, 200, 200, 500, "red");
  72. createBtn(1002, 400, 400, 500, "green");
  73. createBtn(1003, 600, 600, 500, "blue");
  74. createBtn(1004, 800, 800, 500, "black");
  75. createBtn(1005, 1000, 1000, 500, "yellow");
  76. createBtn(1006, 400, 800, 500, "purple");
  77. }
  78. function createBtn(id, x, y, weight, color) {
  79. rect = two.makeRectangle(x, y, 200, 200);
  80. rect.noStroke();
  81. rect.fill = color;
  82. rect.myId = id;
  83. map.set(rect, weight);
  84. }
  85. //计算当前屏幕圆心 对应的 图形坐标
  86. function getScreenOriginal(){
  87. let original = {
  88. x: 0,
  89. y: 0
  90. };
  91. original.x = two.width / 2;
  92. original.y = two.height / 2;
  93. console.log(two.scene._matrix.elements)
  94. //获取水平位移及垂直位移
  95. //将浏览器上界面坐标转换为two.js的场景坐标,也就是 cirX和cirY为当前界面中点的场景坐标
  96. let cirX = (original.x - two.scene._matrix.elements[2]) / two.scene._matrix.elements[0];
  97. let cirY = (original.y - two.scene._matrix.elements[5]) / two.scene._matrix.elements[4];
  98. console.log("cirX:" + cirX + " cirY:" + cirY);
  99. original.x = cirX;
  100. original.y = cirY;
  101. return original;
  102. }
  103. export function flyToPosition(x, y){
  104. let dot = getScreenOriginal();
  105. let circle = two.makeCircle(dot.x, dot.y, 10);
  106. circle.fill = "red";
  107. }

 

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载