From 95ceeb631b6cfc7bc1c4f876ee5874a7e3ef4f17 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Tue, 31 Jan 2017 16:05:23 -0500 Subject: [PATCH 1/9] almost done --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 3 +- images/.DS_Store | Bin 0 -> 6148 bytes src/.DS_Store | Bin 0 -> 6148 bytes src/main.js | 136 ++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 .DS_Store create mode 100644 images/.DS_Store create mode 100644 src/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..543f7c2db523437bfcd05ab62d1b23e18b9c8c5a GIT binary patch literal 6148 zcmeH~%}T>i5QWc}A_X^Hy1cL88-!AypfAv(QUqC4!B-+g2^73rwv&)9F@cH2$fjk2!?ytcyzFW4QIXZ5#u z#XHuqcevQ=aKIi<7t!k{C@KOXAOa#F0wQoqfIZu7dY7tI1VlgtehB#Yq0wFY(jhfI z9b94rpiUSL<8{mu)aC(dUpk~RLbEKTW~tSPVOh?2tGvE+NX>Fs4Ifq~TTLhyr}OzO z(qVn7RuK?^a{@kl(`MfPAL+l$|DGcg0TKA81Z=WcF6Ml>>aC;K^j_QOEBd!FH`2L8 kE2c&(=8d=F`;)xp*WB+*htw!%Jj$v15pXUt5%>!NUkCdfcK`qY literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore index 8d4aaf4..7efe013 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -*.map \ No newline at end of file +*.map +*.un~ diff --git a/images/.DS_Store b/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2f3a33dfea334974dc0eb8b12f6dbbdafaac41bd GIT binary patch literal 6148 zcmeHKJ8r`;3?)+|Fpwo;5+p!3Pd!(UmdDTHy4{>5cm${? zQG62g2GbM~?anVxB5M(8;fC^U!_;iwd}51?C=iY__HwvvkNx{+|2oP3J7C9NW_1kfN@pRD|$dL+Afw2M) zv0PjIe}@0l|Bp#rQ2{D&R|;se*={;KDQoNGaaL;!di80h5~3oFNu co)me-=Gd=^L!i?UcRG+i1Evd&3fx+OE9Ea0tpET3 literal 0 HcmV?d00001 diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Tue, 31 Jan 2017 16:14:45 -0500 Subject: [PATCH 2/9] updates --- README.md | 81 ++--------------------------------------------------- src/main.js | 18 ++++++++++-- 2 files changed, 18 insertions(+), 81 deletions(-) diff --git a/README.md b/README.md index 1410c30..626c646 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,7 @@ # [Project2: Toolbox Functions](https://github.com/CIS700-Procedural-Graphics/Project2-Toolbox-Functions) -## Overview +Author: Joseph Gao -The objective of this assignment is to procedurally model and animate a bird wing. Let's get creative! +Features Implemented +- CHECK BACK @ MIDNIGHT TODAY THANK YOU SORRY I WANT TO MAKE IT MORE PRETTY -Start by forking and then cloning [this repository](https://github.com/CIS700-Procedural-Graphics/Project2-Toolbox-Functions) - -## Modeling - -##### Reference images - -Search for three or more images of a bird wing (or any flying creature, really) in order to provide yourself reference material, as you're going to base your modeling and animation from these images. For the more artistic minds, feel free to sketch your own concept. - -##### Make wing curve - -Begin with a 3D curve for your basic wing shape. Three.js provides classes to create many different types of curves, so you may use whatever type of curve you prefer. - -##### Distribute feathers - -We have provided a simple feather model from which to begin. You are not required to use this model if you have others that you prefer. From this base, you must duplicate the feather to model a complete wing, and your wing should consist of at least thirty feathers. Distribute points along the curve you created previously; you will append the feather primitives to the curve at these points. Make sure that you modify the size, orientation, and color of your feathers depending on their location on the wing. - -Feel free to diversify your wings by using multiple base feather models. - -## Animation - -Add a wind force to your scene, and parameterize its direction and speed. You will use this wind force to animate the feathers of your wing by vibrating them slightly. Using Dat.GUI, allow the user to modify these wind parameters. Please note that we don't care about your feather motion being physically accurate, as long as it looks nice. - -Additionally, animate the control points of your wing curve to make the wing flap, and allow the user to control the speed of the wing flapping. - -## Interactivity - -Using Dat.GUI and the examples provided in the reference code, allow the user to adjust the following controls: - -1. The curvature of the wing's basic shape -2. Feather distribution -3. Feather size -4. Feather color -5. Feather orientation -6. Flapping speed -7. Flapping motion - -## For the Overachievers - -Suggestions: -- Make a pretty iridescent or otherwise feather appropriate shader. -- Otherwise, going the extra mile for this assignment is really in the polish! - -## Submission - -- Create a folder called `references` to include your reference images. - -- Update `README.md` to contain a solid description of your project - -- Publish your project to gh-pages. `npm run deploy`. It should now be visible at http://username.github.io/repo-name - -- Create a [pull request](https://help.github.com/articles/creating-a-pull-request/) to this repository, and in the comment, include a link to your published project. - -- Submit the link to your pull request on Canvas. - -## Getting Started - -1. [Install Node.js](https://nodejs.org/en/download/). Node.js is a JavaScript runtime. It basically allows you to run JavaScript when not in a browser. For our purposes, this is not necessary. The important part is that with it comes `npm`, the Node Package Manager. This allows us to easily declare and install external dependencies such as [three.js](https://threejs.org/), [dat.GUI](https://workshop.chromeexperiments.com/examples/gui/#1--Basic-Usage), and [glMatrix](http://glmatrix.net/). Some other packages we'll be using make it significantly easier to develop your code and create modules for better code reuse and clarity. These tools make it _signficantly_ easier to write code in multiple `.js` files without globally defining everything. - -2. Fork and clone your repository. - -3. In the root directory of your project, run `npm install`. This will download all of those dependencies. - -4. Do either of the following (but I highly recommend the first one for reasons I will explain later). - - a. Run `npm start` and then go to `localhost:7000` in your web browser - - b. Run `npm run build` and then go open `index.html` in your web browser - - You should hopefully see the framework code with a 3D cube at the center of the screen! - - -## Developing Your Code -All of the JavaScript code is living inside the `src` directory. The main file that gets executed when you load the page as you may have guessed is `main.js`. Here, you can make any changes you want, import functions from other files, etc. The reason that I highly suggest you build your project with `npm start` is that doing so will start a process that watches for any changes you make to your code. If it detects anything, it'll automagically rebuild your project and then refresh your browser window for you. Wow. That's cool. If you do it the other way, you'll need to run `npm build` and then refresh your page every time you want to test something. - -## Publishing Your Code -We highly suggest that you put your code on GitHub. One of the reasons we chose to make this course using JavaScript is that the Web is highly accessible and making your awesome work public and visible can be a huge benefit when you're looking to score a job or internship. To aid you in this process, running `npm run deploy` will automatically build your project and push it to `gh-pages` where it will be visible at `username.github.io/repo-name`. \ No newline at end of file diff --git a/src/main.js b/src/main.js index 486be53..bfc57e5 100755 --- a/src/main.js +++ b/src/main.js @@ -7,7 +7,6 @@ import Framework from './framework' var tick = 0; var feathers = 100; var flap_motion = 100; -var wind_direction = 0; var featherGeo; // bone stuff @@ -35,11 +34,16 @@ var wing_curve = function() { this.curve = 0; }; +var wind_direction = function() { + this.wind_direction = 0; +} + // defining our scales var wind_speed_scale = new wind_speed(); var wing_curve_scale = new wing_curve(); var feather_color_scale = new feather_color(); var visible_feathers_scale = new visible_feathers(); +var wind_direction_scale = new wind_direction(); // called after the scene loads function onLoad(framework) { @@ -170,7 +174,10 @@ function onLoad(framework) { var feather = framework.scene.getObjectByName(i); feather.traverse( function ( object ) { object.visible = false; }); } + }); + gui.add(wind_direction_scale, 'wind_direction', 0, 1).onChange(function(newVal) { + wind_direction_scale.wind_direction = newVal; }); } @@ -186,9 +193,14 @@ function onUpdate(framework) { var feather = framework.scene.getObjectByName(i); var date = new Date(); if (feather !== undefined) { - feather.rotateZ(wind_speed_scale.wind_speed / 100 * Math.sin(i * flap_motion + date.getTime() / 100) * 2 * Math.PI / 180); feather.material.color.set(base_color + feather_color_scale.color * 167772); - //feather.translateZ(wind_speed * Math.sin(i * flap_motion + date.getTime() / 100) * 2 * Math.PI / 180); + + if (wind_direction_scale.wind_direction == 0) { + feather.rotateZ(wind_speed_scale.wind_speed / 100 * Math.sin(i * flap_motion + date.getTime() / 100) * 2 * Math.PI / 180); + } + else { + feather.rotateY(wind_speed_scale.wind_speed / 100 * Math.cos(i * flap_motion + date.getTime() / 100) * 2 * Math.PI / 180); + } } } } From 1f3eb56685100c2396f1c9a4c62220bacde33669 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Tue, 31 Jan 2017 16:17:36 -0500 Subject: [PATCH 3/9] updated the package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c80e8a3..cde25c8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "scripts": { "start": "webpack-dev-server --hot --inline", "build": "webpack", - "deploy": "rm -rf npm-debug.log && git checkout master && git commit -am 'update' && gh-pages-deploy" + "deploy": "gh-pages-deploy" }, "gh-pages-deploy": { "prep": [ From 4953f6c350b7ac908e460fabddf4becb6ba55138 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Tue, 31 Jan 2017 22:34:48 -0500 Subject: [PATCH 4/9] finished --- .DS_Store | Bin 6148 -> 6148 bytes npm-debug.log | 45 ++++++++++++++++++++ src/main.js | 116 ++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 130 insertions(+), 31 deletions(-) create mode 100644 npm-debug.log diff --git a/.DS_Store b/.DS_Store index 543f7c2db523437bfcd05ab62d1b23e18b9c8c5a..441bac109af06199ff3a84b0951597330d045269 100644 GIT binary patch delta 47 ycmZoMXfc@J&&V<{z#2&On2Pc+ (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:255:16) +14 verbose stack at emitTwo (events.js:106:13) +14 verbose stack at EventEmitter.emit (events.js:191:7) +14 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14) +14 verbose stack at emitTwo (events.js:106:13) +14 verbose stack at ChildProcess.emit (events.js:191:7) +14 verbose stack at maybeClose (internal/child_process.js:877:16) +14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) +15 verbose pkgid @ +16 verbose cwd /Users/josephgao/Dropbox/developer/cis700_6/Project2-Toolbox-Functions +17 error Darwin 16.3.0 +18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "deploy" +19 error node v6.9.4 +20 error npm v3.10.10 +21 error code ELIFECYCLE +22 error @ deploy: `gh-pages-deploy` +22 error Exit status 1 +23 error Failed at the @ deploy script 'gh-pages-deploy'. +23 error Make sure you have the latest version of node.js and npm installed. +23 error If you do, this is most likely a problem with the package, +23 error not with npm itself. +23 error Tell the author that this fails on your system: +23 error gh-pages-deploy +23 error You can get information on how to open an issue for this project with: +23 error npm bugs +23 error Or if that isn't available, you can get their info via: +23 error npm owner ls +23 error There is likely additional logging output above. +24 verbose exit [ 1, true ] diff --git a/src/main.js b/src/main.js index bfc57e5..1e1925c 100755 --- a/src/main.js +++ b/src/main.js @@ -5,9 +5,10 @@ const THREE = require('three'); // older modules are imported like this. You sho import Framework from './framework' var tick = 0; +var damping = 0.1; var feathers = 100; -var flap_motion = 100; var featherGeo; +var wind_direction = 0; // bone stuff var bone_geometry = new THREE.Geometry(); @@ -16,7 +17,7 @@ var boneMaterial = new THREE.LineBasicMaterial( { color: 0xe3dac9, linewidth: 1 var bone = new THREE.Line(bone_geometry, boneMaterial); -var base_color = 0x000000; +var base_color = 0xFFDFF00; var feather_color = function() { this.color = 0; @@ -38,15 +39,31 @@ var wind_direction = function() { this.wind_direction = 0; } +var feather_size = function() { + this.feather_size = 1; +} + +var flap_speed = function() { + this.flap_speed = 1; +} + +var flap_range = function() { + this.flap_range = 1; +} + // defining our scales var wind_speed_scale = new wind_speed(); var wing_curve_scale = new wing_curve(); var feather_color_scale = new feather_color(); var visible_feathers_scale = new visible_feathers(); var wind_direction_scale = new wind_direction(); +var feather_size_scale = new feather_size(); +var feather_flap_speed = new flap_speed(); +var feather_flap_range = new flap_range(); // called after the scene loads function onLoad(framework) { + console.log('hi'); var scene = framework.scene; var camera = framework.camera; var renderer = framework.renderer; @@ -74,9 +91,9 @@ function onLoad(framework) { scene.background = skymap; - curve.v0 = new THREE.Vector3(0, 0, 0); - curve.v1 = new THREE.Vector3(3, 0, 0); - curve.v2 = new THREE.Vector3(6, 0, 0); + curve.v0 = new THREE.Vector3(-3, 0, 0); + curve.v1 = new THREE.Vector3(0, 0, 0); + curve.v2 = new THREE.Vector3(3, 0, 0); for (var j = 0; j < feathers; j++) { bone_geometry.vertices.push(curve.getPoint(j / feathers)); } @@ -92,12 +109,6 @@ function onLoad(framework) { var featherMesh = new THREE.Mesh(featherGeo, lambertWhite); featherMesh.name = "feather"; featherMesh.position.set(0.1, 0.3, 0); - //var clone = featherMesh.clone(true); - //clone.position.set(0.0, 0.0, 0.0); - //clone.rotateZ(-70); - // Y by PI/2 - // Z by 180 - //scene.add(featherMesh); for (var i = 0; i < bone_geometry.vertices.length; i++) { var vertex = bone_geometry.vertices[i]; var feather = featherMesh.clone(true); @@ -115,7 +126,6 @@ function onLoad(framework) { camera.position.set(0, 1, 5); camera.lookAt(new THREE.Vector3(0,0,0)); - // scene.add(lambertCube); scene.add(directionalLight); // edit params and listen to changes like this @@ -150,8 +160,9 @@ function onLoad(framework) { gui.add(wing_curve_scale, 'curve', -5, 5).onChange(function(newVal) { wing_curve_scale.curve = newVal; - curve.v1 = new THREE.Vector3(3, newVal, 0); - //curve.v2 = new THREE.Vector3(6, newVal, 0); + curve.v0 = new THREE.Vector3(-3, -1 * newVal, 0); + curve.v1 = new THREE.Vector3(0, newVal, 0); + curve.v2 = new THREE.Vector3(3, -1 * newVal, 0); scene.remove(bone); bone_geometry = new THREE.Geometry(); for (var j = 0; j < feathers; j++) { @@ -165,41 +176,84 @@ function onLoad(framework) { var feather = framework.scene.getObjectByName(i); feather.position.set(vertex.x, vertex.y, vertex.z); } + }); - for (var i = 0; i < visible_feathers_scale.feather_count; i++) { - var feather = framework.scene.getObjectByName(i); - feather.traverse( function ( object ) { object.visible = true; }); + gui.add(wind_direction_scale, 'wind_direction', 0, 1).onChange(function(newVal) { + if (wind_direction !== 0) { + for (var i = 0; i < feathers; i++) { + var feather = framework.scene.getObjectByName(i); + if (feather && newVal != 1) { + feather.rotateY(0.03); + } + } + if (newVal === 0) { + wind_direction = 0; + } } - for (var i = Math.round(visible_feathers_scale.feather_count); i < 100; i++) { - var feather = framework.scene.getObjectByName(i); - feather.traverse( function ( object ) { object.visible = false; }); + else { + for (var i = 0; i < feathers; i++) { + var feather = framework.scene.getObjectByName(i); + if (feather && newVal != 0) { + feather.rotateY(-0.03); + } + } + if (newVal === 1) { + wind_direction = 1; + } } + wind_direction_scale.wind_direction = newVal; }); - gui.add(wind_direction_scale, 'wind_direction', 0, 1).onChange(function(newVal) { - wind_direction_scale.wind_direction = newVal; + gui.add(feather_size_scale, 'feather_size', 1, 10).onChange(function(newVal) { + feather_size_scale.feather_size = newVal; + }); + + gui.add(feather_flap_speed, 'flap_speed', 1, 10).onChange(function(newVal) { + feather_flap_speed.flap_speed = newVal; + }); + + gui.add(feather_flap_range, 'flap_range', 1, 5).onChange(function(newVal) { + feather_flap_range.flap_range = newVal; }); } // called on frame updates function onUpdate(framework) { - //var feather = framework.scene.getObjectByName("feather"); - //if (feather !== undefined) { - // Simply flap wing - //feather.rotateZ(Math.sin(date.getTime() / 100) * 2 * Math.PI / 180); - //} - tick += 1; + tick += feather_flap_speed.flap_speed / 10; + var flap_range = feather_flap_range.flap_range; + var disp = flap_range * Math.sin(tick); + + curve.v0 = new THREE.Vector3(-3, -1 * disp, 0); + curve.v1 = new THREE.Vector3(0, disp, 0); + curve.v2 = new THREE.Vector3(3, -1 * disp, 0); + framework.scene.remove(bone); + bone_geometry = new THREE.Geometry(); + for (var j = 0; j < feathers; j++) { + bone_geometry.vertices.push(curve.getPoint(j / feathers)); + } + bone = new THREE.Line(bone_geometry, boneMaterial); + framework.scene.add(bone); + console.log(bone_geometry.vertices.length); + for (var i = 0; i < bone_geometry.vertices.length; i++) { + var vertex = bone_geometry.vertices[i]; + var feather = framework.scene.getObjectByName(i); + if (feather) { + feather.position.set(vertex.x, vertex.y, vertex.z); + } + } + for (var i = 0; i < visible_feathers_scale.feather_count; i++) { var feather = framework.scene.getObjectByName(i); var date = new Date(); + var size_factor = feather_size_scale.feather_size; if (feather !== undefined) { + feather.scale.set((size_factor * i/feathers), (size_factor * i/feathers), (size_factor * i/feathers)); feather.material.color.set(base_color + feather_color_scale.color * 167772); - if (wind_direction_scale.wind_direction == 0) { - feather.rotateZ(wind_speed_scale.wind_speed / 100 * Math.sin(i * flap_motion + date.getTime() / 100) * 2 * Math.PI / 180); + feather.rotateZ(wind_speed_scale.wind_speed / 100 * Math.sin(i + date.getTime() / 100) * 2 * Math.PI / 180); } else { - feather.rotateY(wind_speed_scale.wind_speed / 100 * Math.cos(i * flap_motion + date.getTime() / 100) * 2 * Math.PI / 180); + feather.rotateY(wind_speed_scale.wind_speed / 100 * Math.cos(i + date.getTime() / 100) * 2 * Math.PI / 180); } } } From aa81f4a2908300d7e3fa80e7be7dc3d9a631b441 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Tue, 31 Jan 2017 22:50:28 -0500 Subject: [PATCH 5/9] updated readme and added ref images --- .DS_Store | Bin 6148 -> 6148 bytes README.md | 21 +++++++++++++++++++-- references/owl_wing_bone.jpg | Bin 0 -> 31735 bytes references/wing_with_feathers.jpg | Bin 0 -> 16637 bytes src/main.js | 2 +- 5 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 references/owl_wing_bone.jpg create mode 100644 references/wing_with_feathers.jpg diff --git a/.DS_Store b/.DS_Store index 441bac109af06199ff3a84b0951597330d045269..d45803c6fedc307892353c8465ee5b982889fe13 100644 GIT binary patch delta 232 zcmZoMXfc=|#>B)qu~2NHo+2a1!~pBf0*noeKvqv|Jr_d}Ln=cW5QFGEhGZaFoRe-C zoSdIqz<>Z))#c{9xTKVpBr`Bv+0Ly2R*XYk3J!I0s1_Gwpjy1~86)dvb`E|Hp!+v7 cGJa>C%r9anzzDRd0f>P#h{>=yKx7Lu0EQDVod5s; delta 64 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 Date: Tue, 31 Jan 2017 23:15:50 -0500 Subject: [PATCH 6/9] updates --- npm-debug.log | 45 --------------------------------------------- src/main.js | 5 ++--- 2 files changed, 2 insertions(+), 48 deletions(-) delete mode 100644 npm-debug.log diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index 813a84f..0000000 --- a/npm-debug.log +++ /dev/null @@ -1,45 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'run', 'deploy' ] -2 info using npm@3.10.10 -3 info using node@v6.9.4 -4 verbose run-script [ 'predeploy', 'deploy', 'postdeploy' ] -5 info lifecycle @~predeploy: @ -6 silly lifecycle @~predeploy: no script for predeploy, continuing -7 info lifecycle @~deploy: @ -8 verbose lifecycle @~deploy: unsafe-perm in lifecycle true -9 verbose lifecycle @~deploy: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/josephgao/Dropbox/developer/cis700_6/Project2-Toolbox-Functions/node_modules/.bin:/Users/josephgao/.rvm/gems/ruby-2.3.1/bin:/Users/josephgao/.rvm/gems/ruby-2.3.1@global/bin:/Users/josephgao/.rvm/rubies/ruby-2.3.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/josephgao/.rvm/bin:/Users/josephgao/.rvm/bin -10 verbose lifecycle @~deploy: CWD: /Users/josephgao/Dropbox/developer/cis700_6/Project2-Toolbox-Functions -11 silly lifecycle @~deploy: Args: [ '-c', 'gh-pages-deploy' ] -12 silly lifecycle @~deploy: Returned: code: 1 signal: null -13 info lifecycle @~deploy: Failed to exec deploy script -14 verbose stack Error: @ deploy: `gh-pages-deploy` -14 verbose stack Exit status 1 -14 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:255:16) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at EventEmitter.emit (events.js:191:7) -14 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at ChildProcess.emit (events.js:191:7) -14 verbose stack at maybeClose (internal/child_process.js:877:16) -14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) -15 verbose pkgid @ -16 verbose cwd /Users/josephgao/Dropbox/developer/cis700_6/Project2-Toolbox-Functions -17 error Darwin 16.3.0 -18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "deploy" -19 error node v6.9.4 -20 error npm v3.10.10 -21 error code ELIFECYCLE -22 error @ deploy: `gh-pages-deploy` -22 error Exit status 1 -23 error Failed at the @ deploy script 'gh-pages-deploy'. -23 error Make sure you have the latest version of node.js and npm installed. -23 error If you do, this is most likely a problem with the package, -23 error not with npm itself. -23 error Tell the author that this fails on your system: -23 error gh-pages-deploy -23 error You can get information on how to open an issue for this project with: -23 error npm bugs -23 error Or if that isn't available, you can get their info via: -23 error npm owner ls -23 error There is likely additional logging output above. -24 verbose exit [ 1, true ] diff --git a/src/main.js b/src/main.js index a850571..d8f62f0 100755 --- a/src/main.js +++ b/src/main.js @@ -63,7 +63,6 @@ var feather_flap_range = new flap_range(); // called after the scene loads function onLoad(framework) { - console.log('hi'); var scene = framework.scene; var camera = framework.camera; var renderer = framework.renderer; @@ -81,7 +80,7 @@ function onLoad(framework) { // set skybox var loader = new THREE.CubeTextureLoader(); - var urlPrefix = '/images/skymap/'; + var urlPrefix = 'images/skymap/'; var skymap = new THREE.CubeTextureLoader().load([ urlPrefix + 'px.jpg', urlPrefix + 'nx.jpg', @@ -101,7 +100,7 @@ function onLoad(framework) { // load a simple obj mesh var objLoader = new THREE.OBJLoader(); - objLoader.load('/geo/feather.obj', function(obj) { + objLoader.load('geo/feather.obj', function(obj) { // LOOK: This function runs after the obj has finished loading featherGeo = obj.children[0].geometry; From 91de22435cf0bb900bee56d5e8ab49f58db3a426 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Tue, 31 Jan 2017 23:21:34 -0500 Subject: [PATCH 7/9] fixes? --- src/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.js b/src/main.js index d8f62f0..9417544 100755 --- a/src/main.js +++ b/src/main.js @@ -80,7 +80,7 @@ function onLoad(framework) { // set skybox var loader = new THREE.CubeTextureLoader(); - var urlPrefix = 'images/skymap/'; + var urlPrefix = 'Project2-Toolbox-Functions/images/skymap/'; var skymap = new THREE.CubeTextureLoader().load([ urlPrefix + 'px.jpg', urlPrefix + 'nx.jpg', @@ -100,7 +100,7 @@ function onLoad(framework) { // load a simple obj mesh var objLoader = new THREE.OBJLoader(); - objLoader.load('geo/feather.obj', function(obj) { + objLoader.load('Project2-Toolbox-Functions/geo/feather.obj', function(obj) { // LOOK: This function runs after the obj has finished loading featherGeo = obj.children[0].geometry; From 11850faf97ae98dcd68375b5b27aa1a0ec611282 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Tue, 31 Jan 2017 23:24:18 -0500 Subject: [PATCH 8/9] updates to readme --- README.md | 16 +++++++++++----- src/main.js | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e4227e6..db7e022 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,23 @@ * Author: Joseph Gao * PennKey: gaoj -Features Implemented --------------------- -* Modeling +# Features Implemented + +Modeling +------- + I based my wing and feather structure from that of an owl. To make the bone, I used QuadraticBezierCurve3 to sketch out its rough outline. I attempted to make the bone follow the general structure of an owl wing by finding points that would make the closest parabola possible. Once the Bezier curve was created, I distributed vertices evenly along the bone structure that would serve as the locations of the 100 feathers. -* Animation +Animation +--------- + My scene contains a dynamic, movable wind (just use the GUI). The wind force causes the feathers to be blown a different direction in 3D space. The wind itself causes the feathers to vibrate in place, and the intensity of this can be changed. Additionally, the wing is always flapping. -* Interactivity +Interactivity +------------- + All the required interactivity features have been implemented, and the user is able to alter the intensity and direction of the wind, manually change the curvature of the bone, alter the number of feathers present on the bone, change the feather size, color, and orientation, as well as alter the flapping speed and intensity of the wing. All this can be done through the GUI in the upper right. diff --git a/src/main.js b/src/main.js index 9417544..d8f62f0 100755 --- a/src/main.js +++ b/src/main.js @@ -80,7 +80,7 @@ function onLoad(framework) { // set skybox var loader = new THREE.CubeTextureLoader(); - var urlPrefix = 'Project2-Toolbox-Functions/images/skymap/'; + var urlPrefix = 'images/skymap/'; var skymap = new THREE.CubeTextureLoader().load([ urlPrefix + 'px.jpg', urlPrefix + 'nx.jpg', @@ -100,7 +100,7 @@ function onLoad(framework) { // load a simple obj mesh var objLoader = new THREE.OBJLoader(); - objLoader.load('Project2-Toolbox-Functions/geo/feather.obj', function(obj) { + objLoader.load('geo/feather.obj', function(obj) { // LOOK: This function runs after the obj has finished loading featherGeo = obj.children[0].geometry; From 3ce7292569dd5509ee1157f2a2bdb93d79483105 Mon Sep 17 00:00:00 2001 From: Joseph Gao Date: Tue, 31 Jan 2017 23:25:24 -0500 Subject: [PATCH 9/9] final readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index db7e022..834029f 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ # Features Implemented -Modeling +Modeling ------- -I based my wing and feather structure from that of an owl. +I based my wing and feather structure from that of an owl. To make the bone, I used QuadraticBezierCurve3 to sketch out its rough outline. I attempted to make the bone follow the general structure of an owl wing by finding points that would make the closest parabola possible. Once the Bezier curve was created, I distributed vertices evenly along the bone structure that would serve as the locations of the 100 feathers. @@ -25,6 +25,6 @@ All the required interactivity features have been implemented, and the user is a Extra Credit ------------ -- No extra credit implemented for this homework. +No extra credit implemented for this homework.